Как делают условные выражения в lookaround группах работают в.NET regex?

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

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

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

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

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

Путем я интерпретирую его: когда механизм встречается с "A", он возвращается к запуску строки, и для каждого символа добавляют пустое соответствие к группе фиксации q, если символ является #. Затем это должно перестать работать, если q содержит соответствие. То, что я не понимаю, - то, почему это выражение соответствует обоим Как в моей демонстрационной строке.

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

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

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

Так: как действительно осматривают группы, названные группами фиксации в них, и условные выражения играют вместе?

Спасибо!

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

7
задан Jens 15 July 2010 в 15:23
поделиться

1 ответ

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

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

3
ответ дан 7 December 2019 в 16:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: