Рекурсивный шаблон регулярного выражения не соответствует всем символам, как ожидалось (PHP отличается от реализации PerPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Рекурсивный шаблон регулярного выражения не соответствует всем символам, как ожидалось (PHP отличается от реализации Per

Сообщение Anonymous »

РЕДАКТИРОВАНИЕ: я выбрал ответ ridgerunner, поскольку он содержал информацию, необходимую для решения проблемы. Но мне также хотелось добавить подробное решение к конкретному вопросу на случай, если кто-то еще тоже захочет полностью понять пример. Вы найдете его где-то ниже.
Этот вопрос посвящен разъяснению поведения механизма регулярных выражений PHP для рекурсивных выражений. (Если у вас есть идеи, как правильно сопоставить приведенные ниже строки без использования рекурсивного регулярного выражения PHP, это очень здорово, но вопрос не в этом.)

Код: Выделить всё

a(?:(?R)|a?)a
Это простое выражение, целью которого является поиск совпадения с символом «a» или без него, вложенным в одно или несколько гнезд символа «a». Например, аа, ааа, аааа, ааааа. Для этого вам не нужно использовать рекурсию: было бы отлично. Но смысл в том, чтобы использовать рекурсию.
Вот фрагмент кода, который вы можете запустить, чтобы проверить мой неудачный шаблон: В узоре две буквы «а» обрамляют чередование. При чередовании мы либо сопоставляем рекурсию всего шаблона (две буквы "a", обрамляющие чередование), либо символ "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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»