>  기사  >  Java  >  재귀 또는 균형 그룹 없이 중첩된 괄호를 일치시키는 방법은 무엇입니까?

재귀 또는 균형 그룹 없이 중첩된 괄호를 일치시키는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-25 02:35:02362검색

How to Match Nested Brackets Without Recursion or Balancing Groups?

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

과제:

일련합 일치 Java의 java.util.regex와 같이 재귀 및 균형 그룹 지원이 부족한 정규 표현식을 사용하여 임의로 중첩된 대괄호를 사용하여 지정된 문자열 내에서 세 개의 외부 그룹을 캡처합니다.

(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))

해결 방법: 다음으로 참조 구조

일반적인 믿음과는 달리, 이러한 고급 기능 없이 중첩 괄호를 일치시키는 것은 전방 참조를 사용하여 가능합니다:

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

분석:

이 복잡한 정규식은 두 단계로 작동합니다.

  • 1단계: 미리보기는 문자를 사용하지 않고 균형 잡힌 괄호의 시퀀스를 식별합니다. 이 프로세스는 완전한 외부 그룹이 발견될 때까지 계속됩니다.
  • 2단계: 캡처 그룹은 일치하는 외부 그룹의 콘텐츠를 추출합니다.

작동 방식:

  • '(': 확인 중 '('이 나타날 때까지 문자열을 진행합니다.
  • 일치 균형 있는 괄호: 두 개의 예측을 사용하여 다음 '(' 및 ')'가 균형 있는 방식으로 일치하는지 확인하고 내부 콘텐츠를 캡처합니다.
  • 닫는 괄호 확인: 다음을 확인하세요. 이전에 일치한 '('와 일치하는 닫는 ')' 그리고 더 진행합니다.
  • 외부 그룹 끝 확인: 닫는 '(' 앞에 '('가 더 이상 나타나지 않는지 확인하세요. )'를 사용합니다.

내부 그룹 일치 변형:

내부 그룹 일치의 경우 전략은 동일하게 유지되지만 캡처링 그룹이 사용됩니다. 균형 잡힌 괄호 쌍 안에 일치하는 콘텐츠를 저장하려면:

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

포괄적 중단:

표에는 정규식의 구성 요소와 기능이 요약되어 있습니다.

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 '('

  1. (

위 내용은 재귀 또는 균형 그룹 없이 중첩된 괄호를 일치시키는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.