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