Этот вопрос посвящен разъяснению поведения механизма регулярных выражений PHP для рекурсивных выражений. (Если у вас есть идеи, как правильно сопоставить приведенные ниже строки без использования рекурсивного регулярного выражения PHP, это очень здорово, но вопрос не в этом.)
Код: Выделить всё
a(?:(?R)|a?)a
Код: Выделить всё
aa*a
Вот фрагмент кода, который вы можете запустить, чтобы проверить мой неудачный шаблон:
Код: Выделить всё
На мой взгляд, для "аааа", это должно соответствовать "аааа".
Но вот результат:
Код: Выделить всё
a : no match
aa : aa
aaa : aaa
aaaa : aaa
aaaaa : aaaaa
aaaaaa : aaa
Я пытался проследить путь, по которому, как мне кажется, должен идти движок, но я, должно быть, воображаю это неправильно. Почему движок возвращает «ааа» вместо «аааа»? Что делает его таким нетерпеливым? Должно быть, я представляю себе дерево соответствия в неправильном порядке.
Я это понимаю
Код: Выделить всё
#(?:a|a(?R)a)*#
Подробнее здесь: https://stackoverflow.com/questions/844 ... iffers-fro