2013-08-29 1 views
0

J'utilise le modèle d'expression régulière suivant pour correspondre à une instruction if écrite en style C#;Motif d'expressions régulières pour correspondre à une instruction if en C#?

\b[if]{2}\b[ ]?\({1}(?<HeaderSection>[ \w\s\a\t\=\.\@\#\$\%\&a-zA-Z0-9\(\)\;\/\"\'\[\]\*]*)\){1}(?<CommentSection>[\s\a\w\t a-zA-Z0-9\/\.]*)[\r\n]*\{{1}(?<FunctionBody>[\r\n \a\s\wa-zA-Z0-9\(\)\"\.\;\:]*)[\r\n]*\}{1} 

Son un Patron long regex fou, mais semble fonctionner à certains me extent.Let l'expliquer, il a trois nommés groupes de capture à savoir de HeaderSection, CommentSection et FunctionBody .HeaderSection capture match entre début et fermeture des parenthèses de l'instruction if, comme dans l'instruction ci-dessous;

if(Value1==Function(int Z)) 

il capture; De même CommentSection capture le commentaire (le cas échéant) après les parenthèses de fermeture, donc dans l'instruction ci-dessous;

if(Value1==Function(int Z))//This is a Comment. 

capte

//This is a Comment. 

et FunctionBody capture quoi que ce soit entre {et}, comme dans le code ci-dessous;

if(Value1==Function(int Z))//This is a Comment. 
{ 
    This is the 
    space for 
    function body. 
} 

il capture "Ceci est l'espace pour le corps de la fonction." Donc, c'était une explication de ce que la regex correspond. Maintenant, le problème est que si j'ai une fonction comme celle-ci; Et si je l'associe en utilisant l'expression rationnelle ci-dessus, elle ne correspond pas à la première déclaration si c'est le cas; c.-à-d.

if(Value1==Function(int Z)//This is a Comment. 
{ 
Another function(); 
} 

et place correspond à l'intérieur d'un à-dire

if(Value2==Value1) 
    { 
    Some code 
    } 

S'il vous plaît signaler ce que je l'ai fait mal, ou s'il y a une autre façon qui est moins salissant s'il vous plaît laissez-moi savoir, ou corriger le modèle regex si c'est faux quelque part.Une autre chose que je fais tout cela en C# en utilisant les fonctions d'expression régulière. Merci d'avance.

+8

Je n'ai pas assez de doigts pour pointer sur ce qui est erroné ici. Pourquoi voulez-vous faire cela dans regex? Du tout? –

+0

Non, je ne veux pas utiliser regex mais je ne trouve pas d'autre moyen de le faire, donc je suis obligé de les utiliser. – PurpleXenon

+0

Bon vieux temps http://dinosaur.compilertools.net/ – I4V

Répondre

1
(?<header>if\(.*?)(?<comment>//.*?)*\s\n\{(?<functionbody>.*?)\n\} 

Ceci semble être une solution si le paran est formulé de la manière supposée.

(?<header>if\(.*?) 

correspondront if( suivi de quoi que ce soit, mais avant la section //, il correspondra

if(Value1==Function(int Z))

il passe à la (?<comment>//.*?)*\s qui tout match suivant les // signes mais aussi correspondre s'il n'y a rien * est égal à zéro ou plus d'occurrences, et le \s s'assure qu'il ne va pas au-delà de la fin de la ligne.

puis (\n\{)(?<functionbody>.*?)(\n\}) correspond à { juste après une nouvelle ligne et progresse jusqu'à ce qu'un } soit trouvé juste après un retour à la ligne.

dans

var x = 0 
if(Value1==Function(int Z))//This is a Comment. 
{ 
    if(Value2==Value1) 
    { 
    Some code 
    } 
} 
var y = 0 

if(y == x) 
{ 
    x = y + 1 
} 

il correspondra les groupes suivants:

header: if(Value1==Function(int Z)) 
comment: //This is a Comment. 
functionbody: 
    if(Value2==Value1) 
    { 
    Some code 
    } 

header: if(y == x) 
functionbody: 
     x = y + 1 
Questions connexes