재귀 또는 균형 그룹 없이 중첩 괄호 일치
과제:
일련합 일치 Java의 java.util.regex와 같이 재귀 및 균형 그룹 지원이 부족한 정규 표현식을 사용하여 임의로 중첩된 대괄호를 사용하여 지정된 문자열 내에서 세 개의 외부 그룹을 캡처합니다.
(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))
해결 방법: 다음으로 참조 구조
일반적인 믿음과는 달리, 이러한 고급 기능 없이 중첩 괄호를 일치시키는 것은 전방 참조를 사용하여 가능합니다:
(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
분석:
이 복잡한 정규식은 두 단계로 작동합니다.
작동 방식:
내부 그룹 일치 변형:
내부 그룹 일치의 경우 전략은 동일하게 유지되지만 캡처링 그룹이 사용됩니다. 균형 잡힌 괄호 쌍 안에 일치하는 콘텐츠를 저장하려면:
(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
포괄적 중단:
표에는 정규식의 구성 요소와 기능이 요약되어 있습니다.
Note | Component | Description |
---|---|---|
(?=() | Look for '(' | |
(?: | Start group for iteration | |
(?=.?((?!.?1)) | Look for '(' not followed by 1, which contains the matched inner content | |
(.)(?!.2).*)) | Capture inner content and check for at least one more ')' | |
(?=.?)(?!.?3)) | Look for ')' not followed by 2, which contains the matched outer content | |
(. ) | Capture outer content | |
. | Consume a character | |
) | Close group | |
? | Match as few times as possible | |
.*?(?=1) | Match up to and including the last '(' | |
1*(?=2$) | Match up to the last ')' without encountering more '(' |
위 내용은 재귀 또는 균형 그룹 없이 중첩된 괄호를 일치시키는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!