Как условные выражения в группах поиска работают в регулярном выражении .NET? - PullRequest
7 голосов
/ 14 июля 2010

Играя с регулярными выражениями, особенно со сбалансированным соответствием аромата .NET, я пришел к выводу, что понял, что не так хорошо понимаю внутреннюю работу движка, как думал.Я бы оценил любой вклад в то, почему мои шаблоны ведут себя так, как они!Но сначала ...

Отказ от ответственности: Этот вопрос носит чисто теоретический характер, и любой полученный здесь результат никогда не будет использоваться, или изменяться, и использоваться в рабочем коде для анализа HTML.Когда-либо.Я обещаю.Я действительно боюсь пони.=)

Теперь к моей проблеме.Я попробую сопоставить букву A, если ей не предшествует #.Для демонстрации я всегда буду использовать строку ..A..#..A...Здесь первое A должно совпадать.Конечно, это довольно простая задача с использованием "A(?<!^.*#.*)", но я хотел бы использовать здесь условные выражения, поскольку они могут использоваться для сбалансированных сопоставлений и других интересных вещей.

То, что я пробовал, это

"A(?<=^(#(?<q>)|[^#])*(?(q)(?!)))"

Я интерпретирую это так: когда движок встречает «A», он возвращается к началу строки и для каждого символа добавляет пустое совпадение в группу захвата q, если символ является #,Тогда он должен потерпеть неудачу, если q содержит совпадение.Что я не понимаю, так это то, почему это выражение совпадает с тем, что и в моем примере строки.

Когда я просто удаляю lookbehind и сопоставляю всю строку, это работает:

"^(#(?<q>)|[^#])*(?(q)(?!))A"

соответствуетцелая строка до первого A, даже если квантификатор первой группы является жадным.Вставка «#» в начале также приведет к сбою сопоставления (по желанию).

Итак: как просмотреть группы, именованные группы захвата внутри них и условные выражения, сыгранные вместе?

Спасибо!

Редактировать: Эту проблему легче увидеть в (?<=(?<q>)(?(q)(?!)))., который не должен соответствовать ни одному символу, но соответствует всему.

1 Ответ

3 голосов
/ 14 июля 2010

Условные выражения не очень полезны в сбалансированном сопоставлении - или где-то еще, если на то пошло. ;) Сбалансированное сопоставление работает с использованием именованной группы захвата в качестве стека; каждый раз, когда эта группа совпадает с чем-либо, сопоставленный текст помещается в стек. Также есть специальный синтаксис для выталкивания стека. Вот хорошее введение:

http://blog.stevenlevithan.com/archives/balancing-groups

...