2008-10-17 8 views
2

Ce que je veux faire est de vérifier les mots dupliqués les uns à côté des autres, mais même s'il y a de la ponctuation entre les deux.Regex pour les mots répétés avec ponctuation

Par exemple:

Vivamus Vivamus diam, diam, Vivamus Vivamus diam, diam Vivamus 

il devrait y avoir 4 résultats distincts ici.

Je n'arrive pas à comprendre pourquoi cela ne fonctionne pas; quelqu'un peut-il expliquer pourquoi et me montrer ce que le code correct devrait être?

merci.

(\w*(?:[ ,\.])*?)\1 

PS: en raison de la confusion qu'il cause, je ne vais pas dire que je suis en utilisant le moteur Perl.

Répondre

8

La parenthèse (?: est une parenthèse non-capturante, ce qui signifie qu'elle ne stocke pas les correspondances. Vous devrez utiliser une parenthèse de capture.

(\w+)\W+\1 
+0

NNNEEeeeeAAAAAAAHhhhhhhhhh ..... PAS WORD !!!! C'EST TOUT! MERCI !!! – Keng

0

L'expression originale ne crée pas une capture distincte pour la ponctuation, mais ne comprend la ponctuation capturée dans la première capture. Cela signifie qu'il serait repérer des choses comme:

diam, diam, really, really, twice. 

Mais vous n'êtes pas vraiment intéressé par la ponctuation, de sorte que la solution de tj111 fonctionne correctement, même si le « (?) Est un non-capture entre parenthèses » explication est un peu ... incomplet? Le commentaire cité est précis, mais ce n'est pas la raison pour laquelle l'expression rationnelle globale a échoué.

1

[[\w|\W]+ ]+ travaillé pour moi. Répartition:

\w: caractère mot

\W: caractère non-mot

[\w|\W]+: chaque personnage peut un mot ou un caractère non-mot et répéter 1 fois ou plus

[[\w|\W]+ ]+: .. .appliqué avec un espace à un certain point, tous apparaissant 1 fois ou plus

Questions connexes