재귀 또는 균형 그룹 없이 중첩 괄호 일치
정규 표현식을 사용하여 중첩 괄호 일치는 특히 재귀가 발생하는 Java와 같은 언어에서 어려울 수 있습니다. 및 균형 조정 그룹은 지원되지 않습니다. 다행스럽게도 전방 참조를 사용하여 이 제한을 극복하는 것이 실제로 가능합니다.
외부 그룹 일치
다음 정규식 [1]는 외부 그룹과 일치합니다. 깊이에 제한을 두지 않는 대괄호:
(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)
여기서 표현식은 일치하지 않는 여는 괄호를 제외하고 여는 괄호를 미리 찾고 해당 닫는 괄호를 캡처합니다. 캡처된 하위 문자열은 쓸모는 없지만 일치를 완료하기 위한 자리 표시자 역할을 합니다. ]
내부 그룹 일치내부 그룹을 포함하려면 다음 표현식을 캡처할 수 있습니다.
[2]:(?=\()( ?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(? !.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))
(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))작동 방식
이 메서드는 문자열을 반복하여 다음 여는 괄호와 닫는 괄호를 일치시킵니다. 각 경우에 나머지 문자열을 캡처합니다. 미리보기는 괄호가 균형 잡힌 방식으로 일치하는지 확인합니다.
표현식은 다음과 같이 구성됩니다.
설명 | |
---|---|
'('가 복잡한 구문 분석보다 앞에 있다고 주장합니다. | |
반복된 문자열 처리를 위한 비캡처 그룹 시작 | |
다음 '('가 다음에 오는지 확인 | |
?\1)그룹 1이 뒤따르지 않는 다음 '('까지 일치 | |
\2).*그룹 1을 문자열로 채워 다른 ')'가 있는지 확인합니다. | |
일치하는 ')'가 유효한지 확인 | |
?\2)그룹 2가 뒤따르지 않는 다음 ')'이 존재하는지 확인 | |
나머지 문자열로 그룹 2 채우기 | |
일치하는 ')'가 유효한지 확인 | |
한 문자를 사용하여 일치를 계속합니다. 그룹 | |
그룹 반복(내부 루프에서) | |
마지막 '(' 발견됨 | |
1*(?=\2 $)마지막 ')'까지 일치(그러나 유효한 그룹 내에서) |
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3