2010-09-24 5 views
2

Est-ce que quelqu'un peut m'expliquer pourquoi le résultat de la déclaration suivante a un compte de deux et pas un seul?C# Regex.Matches renvoie trop de correspondances?

MatchCollection matches = new Regex(".*").Matches("foo") ; 
Assert.AreEqual(1, matches.Count) ; // will fail! 

new Regex(".+").Matches("foo") ; // returns one match (as expected) 
new Regex(".*").Matches("") ; // also returns one match 

(je suis en utilisant C# de .NET 3.5)

+0

Avez-vous regardé les matchs pour voir ce qu'ils sont? –

+0

Oui, ils sont "foo" et "" – miasbeck

Répondre

5

L'expression "*." matchs "foo" au début de la chaîne et une chaîne vide à la fin (position 3). Rappelez-vous, * signifie, "zéro ou plus". Donc, cela correspond à "rien" à la fin de la chaîne.

Ceci est cohérent. Regex.Match(string.Empty, ".*"); renvoie une correspondance: une chaîne vide.

+0

Mais le * est gourmand, donc j'ai supposé qu'il ne restait plus rien (pas même une chaîne vide) après le premier match. Je pourrais aussi argumenter qu'il y a un nombre infini de chaînes vides à la fin de l'entrée, pas une seule. Dans les deux cas, je suis perplexe et je dois réécrire certains de mes tests unitaires pour refléter ce comportement. – miasbeck

0

Inclure '^' pour ancrer votre expression correspondant au début de la chaîne d'entrée.

MatchCollection matches = new Regex("^.*").Matches("foo") ; 
+0

Ceci est une solution de contournement, mais je ne comprends toujours pas, pourquoi l'original. * Regex conduit à deux matches – miasbeck

+0

Je suppose que j'aurais dû clarifier votre intention. Qu'essayez-vous de faire? –

+0

Peu importe. L'ancre^est d'accord. – miasbeck

Questions connexes