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

Так он пытается соответствовать a, преуспевает, то пытается сопоставить $, не удается, так что откатывается и пытается другой разъединены, который начинается с \1. Я предполагаю, что когда он попал в «a», \1 взял значение «a», но теперь, поскольку он должен был отступить, он забыл это значение? Так оно работает? И \1 просто не сможет что-либо найти после этой точки?Почему это регулярное выражение не соответствует?

+0

Возможно, вам лучше сказать, с чем вы пытаетесь соответствовать? –

+0

@ Джейсон: Ничего. Просто пытаюсь понять, как они работают ... в глубину. – mpen

ответ

4

Обратные ссылки в регулярных выражениях всегда соответствуют только то, что в настоящее время сопоставлено с. Это проблема согласованности - разделы строки, которые не совпадают, не должны загрязнять состояние механизма соответствия, поскольку это приведет к ложному срабатыванию.

Итак, вы правы: обратная ссылка \1 никогда не будет соответствовать ни на что (даже пустая строка), потому что группа захвата, которой она соответствует, также никогда не будет соответствовать, поскольку она находится на другой стороне оператора чередования.

Смежные вопросы