>  기사  >  백엔드 개발  >  PHP - PCRE 정규식 하위 그룹(하위 패턴)

PHP - PCRE 정규식 하위 그룹(하위 패턴)

伊谢尔伦
伊谢尔伦원래의
2016-11-21 17:19:541416검색

하위 그룹은 괄호로 구분되며 중첩될 수 있습니다. 패턴의 일부를 하위 그룹(하위 패턴)으로 표시하는 것은 주로 두 가지 작업을 수행합니다:

선택적 분기를 지역화합니다. 예를 들어, 패턴 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에서는 (?Ppattern) 구문을 사용하여 하위 그룹의 이름을 지정할 수 있습니다. 이 하위 패턴은 이름과 순서(숫자 아래 첨자)와 함께 일치하는 결과에 표시됩니다. PHP 5.2.2에서는 하위 패턴 이름 지정을 위한 두 가지 구문(?8a11bc632ea32a57b3e3693c7987c420pattern) 및 (? 'name'pattern)을 추가합니다.

때로는 여러 일치 항목이 필요하며 정규 표현식에서 하위 그룹을 선택할 수 있습니다. 여러 하위 그룹이 역참조 번호 문제를 공유할 수 있도록 하기 위해 (?| 구문을 사용하여 번호 복사를 허용합니다. 일요일과 일치하는 다음 정규식을 고려하십시오.

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

역참조 1이 비어 있는 경우 Sun은 역참조에 저장됩니다. 2. 역참조 2가 존재하지 않는 경우 Sat는 역참조 1에 저장됩니다. 이 문제를 해결하려면 (?| 수정 패턴을 사용하십시오.

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

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


.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.