정규식(PCRE) PCRE Patterns Subpatterns

하위 패턴은 중첩될 수 있는 괄호(둥근 괄호)로 구분됩니다. 패턴의 일부를 하위 패턴으로 표시하면 두 가지 작업이 수행됩니다.

  1. 일련의 대안을 현지화합니다. 예를 들어 cat(aract|erpillar|) 패턴은 "cat", "cataract" 또는 "caterpillar"라는 단어 중 하나와 일치합니다. 괄호가 없으면 "cataract", "erpillar" 또는 빈 문자열과 일치합니다.
  2. 캡처하는 하위 패턴으로 하위 패턴을 설정합니다(위에서 정의한 대로). 전체 패턴이 일치하면 하위 패턴과 일치하는 주제 문자열의 해당 부분이 pcre_exec()ovector 인수를 통해 호출자에게 다시 전달됩니다. 여는 괄호는 캡처하는 하위 패턴의 수를 얻기 위해 왼쪽에서 오른쪽(1부터 시작)으로 계산됩니다.

예를 들어, 문자열 "the red king"이 the ((red|white) (king|queen)) 패턴과 일치하는 경우 캡처된 하위 문자열은 "red king", "red" 및 "king"이고 번호가 매겨집니다. 1, 2, 3.

일반 괄호가 두 가지 함수를 수행한다는 사실이 항상 도움이 되는 것은 아닙니다. 캡처 요구 사항 없이 그룹화 하위 패턴이 필요한 경우가 종종 있습니다. 여는 괄호 뒤에 "?:"가 오는 경우 하위 패턴은 캡처를 수행하지 않으며 후속 캡처 하위 패턴의 수를 계산할 때 계산되지 않습니다. 예를 들어 문자열 "white queen"이 the ((?:red|white) (king|queen)) 패턴과 일치하는 경우 캡처된 하위 문자열은 "white queen" 및 "queen"이고 번호가 1과 2입니다. 캡처된 부분 문자열의 최대 개수는 65535개입니다. 그러나 libpcre의 구성 옵션에 따라 이러한 큰 패턴을 컴파일하지 못할 수도 있습니다.

편리한 약식으로, 캡처하지 않는 하위 패턴의 시작 부분에 옵션 설정이 필요한 경우 옵션 문자가 "?" 그리고 ":". 따라서 두 가지 패턴

(?i:saturday|sunday)
(?:(?i)saturday|sunday)
                

정확히 동일한 문자열 집합과 일치합니다. 대체 분기는 왼쪽에서 오른쪽으로 시도되고 옵션은 하위 패턴의 끝에 도달할 때까지 재설정되지 않기 때문에 한 분기의 옵션 설정은 후속 분기에 영향을 미치므로 위 패턴은 "일요일" 및 "토요일"과 일치합니다.

구문(?P<name>pattern)을 사용하여 하위 패턴의 이름을 지정할 수 있습니다. 그런 다음 이 하위 패턴은 일반 숫자 위치와 이름으로 일치 배열에서 인덱싱됩니다. 두 가지 대체 구문(?<name>pattern)(?'name'pattern)이 있습니다.

때로는 여러 개의 일치가 필요하지만 정규식에서 하위 그룹을 교대로 사용해야 합니다. 일반적으로 이들 중 하나만 일치하더라도 각각에는 고유한 역참조 번호가 부여됩니다. 이를 극복하기 위해 (?| 구문은 중복 숫자를 허용합니다. Sunday 문자열과 일치하는 다음 정규식을 고려하십시오.

(?:(Sat)ur|(Sun))day
                

여기서 Sun은 역참조 2에 저장되고 역참조 1은 비어 있습니다. 일치는 역참조 1에서 Sat를 산출하지만 역참조 2는 존재하지 않습니다. (?|를 사용하도록 패턴을 변경하면 이 문제가 해결됩니다.

(?|(Sat)ur|(Sun))day
                

이 패턴을 사용하면 SunSat 모두 역참조 1에 저장됩니다.