2010-10-22 4 views
1

Étant donné le code suivant:mot problème regex limite (chevauchement)

var myList = new List<string> { "red shirt", "blue", "green", "red" }; 
Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b"); 
MatchCollection m = r.Matches("Alfred has a red shirt and blue tie"); 

Je veux que le résultat de m d'inclure "red shirt", "blue", "red" puisque tous ceux qui sont dans la chaîne, mais je ne cesse de se "red shirt", "blue". Que puis-je faire pour inclure les chevauchements?

Répondre

1

Il me semble que l'analyseur d'expression rationnelle supprime la chaîne de correspondance dès que la première correspondance valide est trouvée. Je n'ai pas de configuration de compilateur Windows pour le moment, je ne peux donc pas comparer les pommes à des pommes, mais je vois des résultats similaires dans perl.

Je pense que votre regex ressemblerait à ceci après avoir été rejoint.

'\ b (chemise rouge | bleu | vert | rouge) \ b'

Test cette regexp sur je vois le même résultat que "chemise rouge", "bleu". En déplaçant "chemise rouge" à la fin de la liste des expressions rationnelles.

'\ b (rouge | bleu | vert | chemise rouge) \ b'

Je vois maintenant "rouge", "bleu".

En modifiant l'expression rationnelle pour une approche un peu plus compliquée, vous pourriez obtenir les résultats souhaités.

\ b (bleu | chemise (rouge) | vert) \ b

Cela devrait correspondre rouge comme son propre sous-groupe et chemise rouge comme un groupe aussi.

retours « chemise rouge », « rouge », « bleu »

La façon plus simple de le faire serait de boucle à travers votre liste de chaînes et match de 1 à un moment si vous allez avoir beaucoup mot groupes qui auront besoin de plusieurs matches comme la chemise rouge et rouge.

Puisqu'il ya tellement de façons de faire regexp, il me manque probablement une solution évidente et élégante.