2010-02-04 7 views
-1

Dans certaines situations obscures, une expression régulière comme "/^match /" fonctionne exactement de la même façon qu'une ligne "autre chose", et la seule façon de la résoudre est de mettre toute la regex à l'intérieur des accolades ... "/^(match) /", pourquoi cela se passe-t-il?regex "/^something /" comportement

+2

Huh? Un exemple, s'il vous plaît! –

+0

Etes-vous sûr de ne pas faire quelque chose comme '/ [^ match] /'? Pouvez-vous donner un exemple concret? –

+0

Pouvez-vous nous donner des exemples de codes qui fonctionnent et d'autres qui ne fonctionnent pas? Sinon, il est difficile de comprendre quel pourrait être le problème. –

Répondre

2

Juste une supposition sauvage ici ... le seul exemple que je peux penser à cela donnerait le comportement que vous décrivez est en train de changer:

/^foo|bar/ 

à

/^(foo|bar)/ 

Notez que l'ajout de parenthèses modifie la signification de cette expression régulière. La seconde correspond à foo ou à la barre au début de la chaîne. La première correspond à foo au début de la chaîne ou de la barre n'importe où dans la chaîne. Cela pourrait donner des fausses correspondances comme vous l'avez décrit.

C'est une erreur facile d'oublier les parenthèses ... Je l'ai fait à l'occasion aussi ... rougir ...;)

Je ne peux pas penser à d'autres exemples en ce moment, mais je Je suis sûr qu'il pourrait y avoir d'autres moments où l'ajout de parenthèses donne un subtil changement de sens. La prochaine fois, n'oubliez pas de sauvegarder l'exemple que vous avez trouvé et de le poster ici pour que nous puissions le voir.

+0

Ce serait ma conjecture, aussi. –

0

Estimation totalement aléatoire, mais l'utilisiez-vous dans un split?

En javascript (je ne suis pas aussi sûr de PHP), si je tape ceci:

"matchabc".split(/^match/)

Je reçois:

["", "abc"]

Notez que le match scission utilise pour diviser la chaîne, de sorte que vous obtenez les pièces qui ne correspondent pas.

Cependant, si je fais ceci:

"matchabc".split(/^(match)/)

je reçois:

["", "match", "abc"]

C'est parce que les parenthèses capturent la chose que je vais partager sur. Cela ressemble un peu au comportement que vous décrivez - il serait plus facile de dire si vous postez un exemple qui illustre le problème (pas seulement la regex, mais comment vous l'utilisez et la chaîne sur laquelle elle agit).