최대 및 최소 수량자 제한이 모두 있는 중복의 경우 일치가 실패한 후 패턴이 일치할 수 있는지 확인하기 위해 다른 반복 횟수로 다시 평가됩니다. 패턴 작성자가 구현에 문제가 없음을 확실히 알고 있는 경우 일치 동작을 변경하거나 이전 일치 항목이 실패하도록 하여 이 동작을 방지하는 것이 유용합니다.
d+foo 패턴이 대상 행 123456bar에 적용된 경우의 예를 고려하십시오.
6자리 숫자를 일치시킨 후 "foo"를 일치시키지 못합니다. 일반적인 동작은 일치자가 d+를 사용하려고 할 때입니다. 5개의 숫자만 일치하고, 4개의 숫자만 일치하며, 최종적으로 실패하기 전에 순차적으로 시도합니다. 일회성 하위 그룹은 패턴의 일부가 일치하면 재평가되지 않으므로 "foo" 일치에 대한 첫 번째 실패 직후에 일치자가 실패할 수 있다는 점에서 특별한 의미를 제공합니다. 구문 기호는 (?>d+)bar와 같이 (?>로 시작하는 또 다른 특수 유형의 괄호입니다.
이 괄호는 일치 항목이 포함된 경우 패턴의 일부에 "잠금"을 제공합니다. 즉, future 패턴이 실패한 후 역추적을 방지하고, 다른 작업은 평소대로 계속됩니다.
즉, 대상 문자열의 현재 일치 지점이 다음과 같은 경우입니다. 앵커 포인트, 이 유형의 하위 그룹 일치 문자열은 별도의 패턴 일치와 동일합니다.
일회성 하위 그룹은 간단히 말해서 가능한 한 많은 문자를 일치시킵니다. 따라서 d+와 d+?는 모두 나머지 패턴이 일치하도록 숫자 수를 조정하지만 (?>d+)는 전체 숫자 시퀀스와만 일치합니다. 복잡하고 중첩될 수 있습니다.
일회성 하위 그룹은 대상 문자열 끝에 유효한 일치 항목을 지정하기 위해 예견 어설션과 함께 사용할 수 있습니다. 일치하지 않는 긴 문자열입니다. 일치 항목은 왼쪽에서 오른쪽으로 처리되므로 PCRE는 대상에서 각 "a"를 찾은 다음 패턴의 나머지 부분이 ^.*abcd$인지 확인한 다음 초기 .*를 먼저 찾습니다. 전체 문자열과 일치하지만 실패하면(뒤에 "a"가 없기 때문에) 모든 일치 항목을 역추적하고 순서대로 마지막 문자를 내뱉고 마지막 문자 2개를 "a"로 검색합니다. 전체 문자열에서 오른쪽에서 왼쪽으로 패턴이 작성되면 멋지게 종료할 수 없습니다. ^(?>.*)(?<=abcd) 그러면 .* 부분을 다시 보지 않습니다. 전체 문자열과 일치합니다. 실패하면 긴 문자열에 대한 예측 어설션이 즉시 실패합니다. 패턴은 처리 시간에 있어 상당한 성능 향상을 가져옵니다.
패턴에 무한히 반복할 수 있는 하위 그룹이 포함된 경우 일회성 하위 그룹을 사용하여 내부에서 반복되는 요소는 실패한 일치 비용을 피하는 것입니다. (D+|