하위 그룹은 괄호로 구분되며 중첩될 수 있습니다. 패턴의 일부를 하위 그룹(하위 패턴)으로 표시하는 것은 주로 두 가지 작업을 수행합니다:
선택적 분기를 지역화합니다. 예를 들어, 패턴 cat(arcat|erpillar|)는 "cat", "cataract" 또는 "caterpillar" 중 하나와 일치합니다. 괄호가 없으면 "cataract", "erpillar" 및 빈 문자열과 일치합니다.
하위 그룹을 캡처 하위 그룹(위에 정의됨)으로 설정합니다. 전체 패턴이 일치하면 하위 그룹과 일치하는 대상 문자열 부분이 pcre_exec()()의 oVector 매개 변수를 통해 반환됩니다. 방문객. 왼쪽 괄호가 왼쪽에서 오른쪽으로 나타나는 순서는 해당 하위 그룹의 첨자(1부터 시작)입니다. 이러한 첨자 번호를 통해 캡처 하위 패턴 일치 결과를 얻을 수 있습니다.
예를 들어 문자열 "the red king"을 ((red|white) (king|queen)) 패턴을 사용하여 일치시키면 패턴 일치 결과는 array("red king", "red king)입니다. " , "red", "king"), 여기서 0번째 요소는 전체 패턴 일치의 결과이고 다음 세 요소는 세 개의 하위 그룹 일치의 결과입니다. 아래 표는 각각 1, 2, 3입니다.
사실 괄호로 수행되는 두 가지 기능이 항상 유용한 것은 아닙니다. 종종 그룹화를 위해 하위 그룹을 사용해야 하지만 이를 (개별적으로) 캡처할 필요는 없습니다. 하위 그룹 정의의 왼쪽 대괄호 바로 뒤에 문자열 "?:"이 따라오면 하위 그룹이 별도로 캡처되는 것을 방지하고 후속 하위 그룹 일련 번호 계산에 영향을 주지 않습니다. 예를 들어 문자열 "the white queen"이 패턴 ((?:red|white) (king|queen))과 일치하는 경우 일치하는 결과는 array("white queen", "white queen", "white queen"이 됩니다. ) , 및 king|queen의 두 하위 그룹. 캡처된 하위 그룹의 최대 수는 99개이며 허용되는 모든 하위 그룹(캡처된 하위 그룹 및 캡처되지 않은 하위 그룹 포함)의 최대 수는 200개입니다.
약어의 편의를 위해 비캡처 하위 그룹의 시작 부분에 옵션을 설정해야 하는 경우 옵션 문자는 ?와: 사이에 올 수 있습니다. 예:
(?i:saturday|sunday) (?:(?i)saturday|sunday)
위의 두 가지 작성 방법은 실제로 동일한 패턴입니다. 선택적 브랜치는 왼쪽에서 오른쪽으로 각 브랜치를 시도하고 하위 모드가 끝나기 전에 옵션이 재설정되지 않으며 옵션 설정이 다른 후속 브랜치에 영향을 주기 때문에 위의 패턴이 일치합니다. 토요일".
PHP 4.3.3에서는 (?P
때로는 여러 일치 항목이 필요하며 정규 표현식에서 하위 그룹을 선택할 수 있습니다. 여러 하위 그룹이 역참조 번호 문제를 공유할 수 있도록 하기 위해 (?| 구문을 사용하여 번호 복사를 허용합니다. 일요일과 일치하는 다음 정규식을 고려하십시오.
(?:(Sat)ur|(Sun))day
역참조 1이 비어 있는 경우 Sun은 역참조에 저장됩니다. 2. 역참조 2가 존재하지 않는 경우 Sat는 역참조 1에 저장됩니다. 이 문제를 해결하려면 (?| 수정 패턴을 사용하십시오.
(?|(Sat)ur|(Sun))day
이 패턴을 사용하면 Sun과 Sat가 모두 역참조 1에 저장됩니다.