Поиск…


замечания

Рекурсия в основном доступна в Perl-совместимых ароматах, таких как:

  • Perl
  • PCRE
  • Oniguruma
  • Увеличение

Восстановите весь шаблон

Конструкция (?R) эквивалентна (?0) (или \g<0> ) - она ​​позволяет вам повторить весь шаблон:

<(?>[^<>]+|(?R))+>

Это будет соответствовать правильно сбалансированным угловым скобкам с любым текстом между скобками, например <a<b>c<d>e> .

Записаться в подшаблон

Вы можете записаться в подшаблон, используя следующие конструкции (в зависимости от вкуса), предполагая, что n - номер группы захвата, и name имя группы захвата.

  • (?n)
  • \g<n>
  • \g'0'
  • (?&name)
  • \g<name>
  • \g'name'
  • (?P>name)

Следующий шаблон:

 \[(?<angle><(?&angle)*+>)*\]

Будет соответствовать текст, например: [<<><>><>] - хорошо сбалансированные угловые скобки в квадратных скобках. Рекурсия часто используется для сопоставления сбалансированных конструкций.

Определения подшаблонов

Конструкция (?(DEFINE) ... ) позволяет вам определять подшаблоны, которые вы можете ссылаться позже через рекурсию. Когда встречается в шаблоне, он не будет сопоставляться.

Эта группа должна содержать именованные подшаблонные определения, которые будут доступны только через рекурсию. Вы можете определить грамматики следующим образом:

(?x) # ignore pattern whitespace
(?(DEFINE)
  (?<string> ".*?" )
  (?<number> \d+ )
  (?<value>
    \s* (?:
        (?&string)
      | (?&number)
      | (?&list)
    ) \s*
  )
  (?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$

Этот шаблон будет проверять текст следующим образом:

[42, "abc", ["foo", "bar"], 10]

Обратите внимание, как список может содержать одно или несколько значений, а сами значения могут быть списком.

Относительные ссылки групп

На подшаблонах можно ссылаться на их относительный номер группы:

  • (?-1) будет возвращаться в предыдущую группу
  • (?+1) перейдет в следующую группу

Также можно использовать синтаксис \g<N> .

Обратные ссылки в рекурсии (PCRE)

В PCRE сопоставляемые группы, используемые для обратных ссылок до рекурсии, хранятся в рекурсии. Но после рекурсии они все сбрасываются до того, что они были перед входом в нее. Другими словами, согласованные группы в рекурсии забыты.

Например:

(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}

Матчи

aaabba

Рекурсии являются атомарными (PCRE)

В PCRE он не отслеживает после того, как найдено первое совпадение для рекурсии. Так

(?(DEFINE)(aaa|aa|a))(?1)ab

не соответствует

aab

потому что после того, как он сопоставил aa в рекурсии, он никогда не пытается снова соответствовать только a .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow