정규식(PCRE) PCRE Patterns Assertions

어설션은 실제로 문자를 사용하지 않는 현재 일치 지점 다음 또는 이전의 문자에 대한 테스트입니다. \b, \B, \A, \Z, \z, ^ 및 $로 코딩된 간단한 어설션은 이스케이프 시퀀스에 설명되어 있습니다. 더 복잡한 어설션은 하위 패턴으로 코딩됩니다. 두 가지 종류가 있습니다. 주제 문자열에서 현재 위치를 앞서 보는 것과 뒤에서 보는 것입니다.

어설션 하위 패턴은 현재 일치 위치가 변경되지 않는다는 점을 제외하고는 일반적인 방법으로 일치됩니다. 미리보기 어설션은 긍정적인 어설션의 경우 (?=, 부정적인 어설션의 경우 (?!)로 시작합니다. 예를 들어 \w+(?=;)는 단어 다음에 세미콜론이 오는 것과 일치하지만 일치 항목에 세미콜론을 포함하지 않고 foo(?!bar)는 "bar"가 뒤따르지 않는 "foo"의 모든 발생과 일치합니다. 겉보기에 유사한 패턴(?!foo)bar는 "foo"가 아닌 다른 것이 앞에 오는 "bar"의 발생을 찾지 않습니다. ; 다음 세 문자가 "bar"일 때 어설션(?!foo)은 항상 true이기 때문에 "bar"의 모든 발생을 찾습니다. 이 효과를 얻으려면 lookbehind 어설션이 필요합니다.

Lookbehind assertion은 (?<= 긍정적인 어설션의 경우 (?<!), 부정적인 어설션의 경우 (?<!)로 시작합니다. 예를 들어 (?<!foo)bar는 "foo"가 앞에 오지 않는 "bar"를 찾습니다. lookbehind 어설션은 일치하는 모든 문자열이 고정된 길이를 가져야 하도록 제한됩니다. 그러나 여러 대안이 있는 경우 모두 동일한 고정 길이를 가질 필요는 없습니다. 따라서 (?<=bullock|donkey)가 허용됩니다. 그러나 (?<!dogs?|cats?)는 컴파일 시 오류를 일으킵니다. 다른 길이의 문자열과 일치하는 분기는 lookbehind 어설션의 최상위 수준에서만 허용됩니다. 이것은 모든 분기가 동일한 길이의 문자열과 일치합니다. (?<=ab(c|de))와 같은 어설션은 단일 최상위 분기가 두 개의 다른 길이와 일치할 수 있기 때문에 허용되지 않지만 두 개의 최상위 분기를 사용하도록 다시 작성하면 허용됩니다. 레벨 분기: (?<=abc|abde) lookbehind 어설션의 구현은 각 대안에 대해 일시적으로 이동하는 것입니다. 현재 위치를 고정 너비만큼 되돌린 다음 일치를 시도합니다. 현재 위치 이전에 문자가 부족할 경우 일치하지 않는 것으로 간주됩니다. 한 번만 사용하는 하위 패턴과 함께 lookbehinds는 문자열 끝에서 일치하는 데 특히 유용할 수 있습니다. 한 번만 사용하는 하위 패턴에 대한 섹션의 끝에 예제가 제공됩니다.

(어떤 종류의) 여러 어설션이 연속적으로 발생할 수 있습니다. 예를 들어, (?<=\d{3})(?<!999)foo는 "999"가 아닌 세 자리 숫자가 앞에 오는 "foo"와 일치합니다. 각 어설션은 주제 문자열의 동일한 지점에서 독립적으로 적용됩니다. 먼저 앞의 세 문자가 모두 숫자인지 확인한 다음 동일한 세 문자가 "999"가 아닌지 확인합니다. 이 패턴은 6자가 앞에 오는 "foo"와 일치하지 않습니다. 첫 번째는 숫자이고 마지막 세 개는 "999"가 아닙니다. 예를 들어 "123abcfoo"와 일치하지 않습니다. 이를 수행하는 패턴은 (?<=\d{3}...)(?<!999)foo입니다.

이번에는 첫 번째 어설션이 앞의 6개 문자를 살펴보고 처음 3개가 숫자인지 확인한 다음 두 번째 어설션에서 앞의 세 문자가 "999"가 아닌지 확인합니다.

어설션은 어떤 조합으로든 중첩될 수 있습니다. 예를 들어, (?<=(?<!foo)bar)baz는 "bar"가 앞에 오고 "foo"가 앞에 오지 않는 "baz"와 일치하지만 (?<=\d{3}...(?<!999))foo는 "foo" 앞에 세 자리 숫자와 "999"가 아닌 세 문자가 있는 또 다른 패턴입니다.

어설션 서브패턴은 서브패턴을 캡처하지 않으며, 동일한 것을 여러 번 어설션하는 것은 의미가 없기 때문에 반복되지 않을 수 있습니다. 어떤 종류의 어설션에 그 안에 캡처하는 하위 패턴이 포함되어 있으면 전체 패턴에서 캡처하는 하위 패턴의 번호를 매기기 위한 목적으로 계산됩니다. 그러나 부분 문자열 캡처는 부정적인 어설션에 의미가 없기 때문에 긍정적인 어설션에 대해서만 수행됩니다.

어설션은 최대 200개의 괄호로 묶인 하위 패턴에 포함됩니다.