php — PCRE 정규식 일회성 하위 그룹화

伊谢尔伦
풀어 주다: 2016-11-21 17:13:48
원래의
1204명이 탐색했습니다.

최대 및 최소 수량자 제한이 모두 있는 중복의 경우 일치가 실패한 후 패턴이 일치할 수 있는지 확인하기 위해 다른 반복 횟수로 다시 평가됩니다. 패턴 작성자가 구현에 문제가 없음을 확실히 알고 있는 경우 일치 동작을 변경하거나 이전 일치 항목이 실패하도록 하여 이 동작을 방지하는 것이 유용합니다.

d+foo 패턴이 대상 행 123456bar에 적용된 경우의 예를 고려하십시오.

6자리 숫자를 일치시킨 후 "foo"를 일치시키지 못합니다. 일반적인 동작은 일치자가 d+를 사용하려고 할 때입니다. 5개의 숫자만 일치하고, 4개의 숫자만 일치하며, 최종적으로 실패하기 전에 순차적으로 시도합니다. 일회성 하위 그룹은 패턴의 일부가 일치하면 재평가되지 않으므로 "foo" 일치에 대한 첫 번째 실패 직후에 일치자가 실패할 수 있다는 점에서 특별한 의미를 제공합니다. 구문 기호는 (?>d+)bar와 같이 (?>로 시작하는 또 다른 특수 유형의 괄호입니다.

이 괄호는 일치 항목이 포함된 경우 패턴의 일부에 "잠금"을 제공합니다. 즉, future 패턴이 실패한 후 역추적을 방지하고, 다른 작업은 평소대로 계속됩니다.

즉, 대상 문자열의 현재 일치 지점이 다음과 같은 경우입니다. 앵커 포인트, 이 유형의 하위 그룹 일치 문자열은 별도의 패턴 일치와 동일합니다.

일회성 하위 그룹은 간단히 말해서 가능한 한 많은 문자를 일치시킵니다. 따라서 d+와 d+?는 모두 나머지 패턴이 일치하도록 숫자 수를 조정하지만 (?>d+)는 전체 숫자 시퀀스와만 일치합니다. 복잡하고 중첩될 수 있습니다.

일회성 하위 그룹은 대상 문자열 끝에 유효한 일치 항목을 지정하기 위해 예견 어설션과 함께 사용할 수 있습니다. 일치하지 않는 긴 문자열입니다. 일치 항목은 왼쪽에서 오른쪽으로 처리되므로 PCRE는 대상에서 각 "a"를 찾은 다음 패턴의 나머지 부분이 ^.*abcd$인지 확인한 다음 초기 .*를 먼저 찾습니다. 전체 문자열과 일치하지만 실패하면(뒤에 "a"가 없기 때문에) 모든 일치 항목을 역추적하고 순서대로 마지막 문자를 내뱉고 마지막 문자 2개를 "a"로 검색합니다. 전체 문자열에서 오른쪽에서 왼쪽으로 패턴이 작성되면 멋지게 종료할 수 없습니다. ^(?>.*)(?<=abcd) 그러면 .* 부분을 다시 보지 않습니다. 전체 문자열과 일치합니다. 실패하면 긴 문자열에 대한 예측 어설션이 즉시 실패합니다. 패턴은 처리 시간에 있어 상당한 성능 향상을 가져옵니다.

패턴에 무한히 반복할 수 있는 하위 그룹이 포함된 경우 일회성 하위 그룹을 사용하여 내부에서 반복되는 요소는 실패한 일치 비용을 피하는 것입니다. (D+|)*[!?] 패턴은 무제한으로 일치합니다. 뒤에 ! 또는 ?가 오면 숫자가 아닌 문자 또는 숫자 문자가 포함됩니다. 그러나 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"에 적용하면 시간이 많이 걸립니다. 이는 문자열이 두 반복 규칙 모두에 사용될 수 있기 때문입니다. (PCRE와 Perl 모두 패턴이 단일 문자로 끝날 때 오류 보고를 최적화했기 때문에 예제의 끝은 단일 문자 대신 [!?]입니다. . 일치해야 하는 마지막 단일 문자를 추적하고 문자열에 해당 문자가 나타나지 않으면 신속하게 오류를 보고합니다. ) 모드를 ((?>D+)|)*[!?] 로 변경하면 빠르게 오류가 발생합니다. (주석: 여기에 제시된 모드의 경우 대상 문자열이 길면 시간 소모가 급격히 증가하므로주의해서 사용하십시오.)

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!