Играя вокруг с регулярными выражениями, особенно сбалансированное соответствие разновидности.NET, я приехал в точку, где я понял, что не понимаю внутренние работы механизма как хорошие, поскольку я думал, что сделал. Я ценил бы любой вход на том, почему мои шаблоны ведут себя способ, которым они делают! Но кулак...
Отказ от ответственности: Этот вопрос является чисто теоретическим, и любой результат, полученный здесь, никогда не будет использоваться, или изменяться и использоваться в производственном коде для парсинга HTML. Когда-либо. Я обещаю. Я действительно боюсь пони. =)
Теперь к моей проблеме. Я попытаюсь соответствовать букве A
, если этому не предшествуют #
. Для демонстрации я буду alway использовать строку ..A..#..A..
. Здесь, первое A
должен быть подобран. Конечно, это - довольно легкая задача при помощи "A(?<!^.*#.*)"
, но я хочу использовать условные выражения здесь, так как они могут использоваться для сбалансированных соответствий и других прохладных вещей.
То, что я попробовал,
"A(?<=^(#(?<q>)|[^#])*(?(q)(?!)))"
Путем я интерпретирую его: когда механизм встречается с "A", он возвращается к запуску строки, и для каждого символа добавляют пустое соответствие к группе фиксации q, если символ является #. Затем это должно перестать работать, если q содержит соответствие. То, что я не понимаю, - то, почему это выражение соответствует обоим Как в моей демонстрационной строке.
Когда я просто удаляю lookbehind и соответствую целой строке, это работает:
"^(#(?<q>)|[^#])*(?(q)(?!))A"
соответствует целой строке до первого A, даже если квантор первой группы является жадным. Вставка '#' вначале также заставит соответствие перестать работать (как желаемый).
Так: как действительно осматривают группы, названные группами фиксации в них, и условные выражения играют вместе?
Спасибо!
Править: Эта проблема видна более легко в (?<=(?<q>)(?(q)(?!))).
, который не должен соответствовать никакому символу, но соответствует всему.
Условные выражения на самом деле не так полезны в сбалансированном сопоставлении - или где-либо еще, если на то пошло. ;) Сбалансированное сопоставление работает с использованием именованной группы захвата в качестве стека; каждый раз, когда эта группа соответствует чему-то, соответствующий текст помещается в стек. Также есть специальный синтаксис для извлечения стека. Вот хорошее введение: