"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 재귀 또는 균형 그룹 없이 중첩된 괄호를 일치시킬 수 있습니까?

재귀 또는 균형 그룹 없이 중첩된 괄호를 일치시킬 수 있습니까?

2024-11-06에 게시됨
검색:134

Can Nested Brackets Be Matched Without Recursion or Balancing Groups?

재귀 또는 균형 그룹 없이 중첩 괄호 일치

정규 표현식을 사용하여 중첩 괄호 일치는 특히 재귀가 발생하는 Java와 같은 언어에서 어려울 수 있습니다. 및 균형 조정 그룹은 지원되지 않습니다. 다행스럽게도 전방 참조를 사용하여 이 제한을 극복하는 것이 실제로 가능합니다.

외부 그룹 일치

다음 정규식 [1]는 외부 그룹과 일치합니다. 깊이에 제한을 두지 않는 대괄호:

(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)

여기서 표현식은 일치하지 않는 여는 괄호를 제외하고 여는 괄호를 미리 찾고 해당 닫는 괄호를 캡처합니다. 캡처된 하위 문자열은 쓸모는 없지만 일치를 완료하기 위한 자리 표시자 역할을 합니다. ]

내부 그룹 일치

내부 그룹을 포함하려면 다음 표현식을 캡처할 수 있습니다.

[2]

:(?=\()( ?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(? !.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))

(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$))) 

작동 방식

이 메서드는 문자열을 반복하여 다음 여는 괄호와 닫는 괄호를 일치시킵니다. 각 경우에 나머지 문자열을 캡처합니다. 미리보기는 괄호가 균형 잡힌 방식으로 일치하는지 확인합니다.

표현식은 다음과 같이 구성됩니다.

구성 요소(?=()(?: (?=.?((?!.(.)(?!.).?)(?!.(.*))) ?.*?(?=\ 1)이 방법을 사용하면 필요 없이 중첩된 대괄호를 효율적으로 일치시킬 수 있습니다. 재귀 또는 균형 조정 그룹의 경우.
설명
'('가 복잡한 구문 분석보다 앞에 있다고 주장합니다.
반복된 문자열 처리를 위한 비캡처 그룹 시작
다음 '('가 다음에 오는지 확인
?\1)그룹 1이 뒤따르지 않는 다음 '('까지 일치
\2).*그룹 1을 문자열로 채워 다른 ')'가 있는지 확인합니다.
일치하는 ')'가 유효한지 확인
?\2)그룹 2가 뒤따르지 않는 다음 ')'이 존재하는지 확인
나머지 문자열로 그룹 2 채우기
일치하는 ')'가 유효한지 확인
한 문자를 사용하여 일치를 계속합니다. 그룹
그룹 반복(내부 루프에서)
마지막 '(' 발견됨
1*(?=\2 $)마지막 ')'까지 일치(그러나 유효한 그룹 내에서)


(
릴리스 선언문 이 글은 1729740015에서 재인쇄되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3