수색…


비고

재귀는 주로 다음과 같은 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 다시 시도하지 않기 때문입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow