2010-12-07 8 views
1
Regex.IsMatch("ab", @"^(?:(a)|\1b)$") == False 

Il tente de faire correspondre a, réussit, puis tente de faire correspondre $, échoue, il revient en arrière et tente l'autre disjointe, qui commence par \1. Je suppose que quand il a frappé le "a" \1 a pris la valeur "a", mais maintenant, parce qu'il devait revenir en arrière, il a oublié cette valeur? Est-ce ainsi que ça fonctionne? Et \1 échouera juste à correspondre à tout ce point après ce point?Pourquoi cette expression régulière ne correspond pas?

+0

Il est peut-être préférable de nous dire ce que vous essayez de faire correspondre? –

+0

@Jason: Rien. Juste essayer de comprendre comment ils fonctionnent ... en profondeur. – mpen

Répondre

4

Les références arrière dans les expressions régulières correspondent toujours uniquement à actuellement comparées. C'est un problème de cohérence - les sections de la chaîne qui ne correspondent pas ne devraient pas polluer l'état du moteur correspondant, car cela entraînerait un faux positif. Donc oui, vous avez raison: la référence arrière \1 ne correspondra à rien (pas même la chaîne vide) car le groupe de capture auquel elle correspond ne correspondra jamais, puisqu'il est de l'autre côté d'un opérateur d'alternance.

Questions connexes