Regular Expressions
재귀
수색…
비고
재귀는 주로 다음과 같은 Perl 호환 유형으로 사용할 수 있습니다.
- 펄
- PCRE
- 오니 구루 마
- 후원
전체 패턴 재귀
구조체 (?R)
는 (?0)
(또는 \g<0>
)과 동일하므로 전체 패턴을 반복 할 수 있습니다.
<(?>[^<>]+|(?R))+>
이렇게하면 <a b> <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
와 일치하는 a
다시 시도하지 않기 때문입니다.