Regular Expressions
Рекурсия
Поиск…
замечания
Рекурсия в основном доступна в 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
.