매처가 조건부로 하위 그룹과 일치하도록 하거나 어설션 결과 또는 이전 캡처 하위 그룹이 일치하는지 여부에 따라 두 개의 선택적 하위 그룹 중에서 선택할 수 있습니다. 조건부 하위 그룹의 두 가지 구문은 다음과 같습니다.
(?(condition)yes-pattern) (?(condition)yes-pattern|no-pattern)
조건이 충족되면 yes 패턴이 사용되고, 그렇지 않으면 no 패턴이 사용됩니다(지정된 경우). 선택적 하위 그룹이 2개 이상 있으면 컴파일 시간 오류가 생성됩니다.
두 가지 조건이 있습니다. (조건)의 괄호가 숫자로 구성된 텍스트인 경우, 숫자가 나타내는 (이전) 하위 그룹이 일치하면(즉, yes 패턴을 사용하여) 조건이 만족됩니다. 더 쉽게 읽을 수 있도록 공백이 추가되고(PCRE_EXTENDED 옵션 참조) 세 부분으로 나누어진 다음 패턴을 고려하세요. ( ( )? [^()]+ (?(1) ) )
첫 번째 부분패턴의 선택 사항인 왼쪽 괄호와 일치하며, 해당 문자가 나타나면 캡처된 하위 문자열의 첫 번째 하위 그룹으로 설정합니다. 두 번째 부분은 대괄호가 아닌 문자 중 하나 이상과 일치합니다. 세 번째 부분은 첫 번째 하위 그룹이 일치하는지 여부를 테스트하는 조건부 하위 그룹입니다. 즉, 대상 문자열이 왼쪽 대괄호로 시작하고 조건이 TRUE인 경우 yes 패턴을 사용합니다. 여기에는 오른쪽 대괄호가 필요합니다. 그렇지 않으면 패턴이 없으므로 하위 그룹은 어떤 것과도 일치하지 않습니다. 즉, 이 패턴은 괄호가 없거나 닫는 괄호로 묶인 일련의 문자와 일치합니다.
조건 문자열(R)인 경우 패턴이나 하위 패턴에 대한 재귀 호출을 받을 때 만족됩니다. "최상위 수준"에서는 조건이 항상 false입니다.
조건이 일련의 숫자나 (R)이 아닌 경우 어설션이어야 합니다. 여기서의 주장은 임의적, 긍정적, 부정적, 전진 또는 후진일 수 있습니다. 가독성을 위해 약간의 공백이 추가되고 두 번째 줄에 두 개의 대체 경로가 있는 이 패턴을 다시 고려해보세요.
(?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
조건부 소문자 이외의 알파벳 문자와 그 뒤에 소문자의 선택적 시퀀스를 일치시키는 긍정적 어설션입니다. 즉, 대상에 소문자가 하나 이상 있는지 테스트하고, 소문자가 발견되면 대상은 첫 번째 선택적 분기와 일치하고, 그렇지 않으면 두 번째 분기와 일치합니다. 이 패턴은 dd-aaa-dd 또는 dd-dd-dd라는 두 가지 형식의 문자열과 일치합니다. aaa는 소문자를 나타내고 dd는 숫자를 나타냅니다.