2009-10-15 2 views
0

Disons que je suis correspondant à un modèle qui a des sous-expressions comme celui-ci:Comment obtenir une sous-expression correspondante à partir d'un match Regex? (C#)

Regex myRegex = new Regex("(man|woman|couple) seeking (man|woman|couple|aardvark)"); 

string myStraightText = "Type is man seeking woman, age is 44"; 
MatchCollection myStraightMatches = myRegex.Matches(myStraightText); 

string myGayText = "Type is man seeking man, age is 39"; 
MatchCollection myGayMatches = myRegex.Matches(myGayText); 

string myBizarreText = "Type is couple seeking aardvark, age is N/A"; 
MatchCollection myBizarreMatches = myRegex.Matches(myBizarreText); 

Sur le premier match, je voudrais récupérer les informations que le premier sous-expression adaptée « homme » (et pas "femme" ou "couple") et la deuxième sous-expression correspond à "femme" (et non "homme" ou "couple" ou "aardvark"). Alors que le deuxième match était "man" et "man" etc. Cette information est-elle disponible quelque part dans l'objet Match?

Je ne sais comment obtenir la chaîne complète. Par exemple,

foreach (Match myMatch in myStraightMatches) 
{ 
    tbOutput.Text += String.Format("{0}\n", myMatch); 
} 

obtient "homme qui cherche une femme". Mais je ne sais pas quelles parties de cette chaîne provenaient de quelle sous-expression.

Répondre

5

Essayez ceci:

myMatch.Groups[0] // "man seeking woman" 
myMatch.Groups[1] // "man" 
myMatch.Groups[2] // "woman" 

EDIT: Pour réponse plus complète, si vous avez:

new Regex("(?<seeker>man|woman|couple) seeking (?<target>man|woman|couple)"); 

vous pouvez utiliser:

myMatch.Groups["seeker"] // "man" 
myMatch.Groups["target"] // "woman" 
+2

+1 pour les groupes. Rappelez-vous que vous pouvez nommer les groupes dans .net, comme (? (homme | femme | couple)), vous permettra d'identifier le groupe avec myMatch.Groups ["seeker"] – kiwipom

+0

@IanR, ty; à jour –

3

Vous pouvez utiliser numbered groupes que Rubens Farias a suggéré. Cependant, les groupes numérotés peuvent souvent être fragiles à de petites erreurs de programmation ou à des modifications ultérieures de l'expression rationnelle. En règle générale, j'essaie d'utiliser des groupes nommés, en général

La syntaxe ressemble (?<name>...)

Ensuite, vous pouvez faire référence à des groupes comme ceci:

myMatch.Groups["name"] 
+0

+1, bon conseil Kennet –

Questions connexes