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

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

Patricia Arquette
Patricia Arquette원래의
2024-10-25 02:37:02437검색

Can Regex Match Nested Brackets Without Recursion or Balancing Groups?

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

과제:
다음과 같은 정규 표현식 가능 Java의 java.util.regex에 있는 항목은 재귀 또는 균형 그룹에 의존하지 않고 임의로 중첩된 대괄호와 일치합니까?

해결책:
예, 전방 참조를 사용하면 가능합니다.

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

작동 방식:
이 표현식은 중첩된 괄호 그룹을 식별하기 위해 함께 작동하는 여러 예측 및 전방 참조로 구성됩니다.

  • (? =()는 다음 문자가 여는 괄호인지 확인합니다.
  • (?:...) ?.*?(?=...): 문자열을 반복하는 비캡처 그룹입니다.
  • (?=.*?((?!.*?1): 이미 일치하는 그룹의 일부가 아닌 다음 여는 괄호를 미리 찾습니다(1에서 캡처).
  • (.*)(?!.*2).*): 문자열의 나머지 부분을 캡처하고 하나 이상의 추가 닫는 괄호와 일치합니다.
  • (?=.*?)(?!.*?2 ): 이미 일치하는 그룹의 일부가 아닌 다음 닫는 괄호를 찾기 위해 미리 검색합니다(2에서 캡처).
  • .*?(?=1): 발견된 마지막 여는 괄호까지 포함하여 일치합니다. .
  • [^(]*(?=2$): 마지막 닫는 괄호가 발견될 때까지 일치하여 그 사이에 더 이상 여는 괄호가 없도록 합니다.

예:
다음 문자열은 세 개의 중첩 그룹과 일치합니다.

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

내부 그룹 일치:
내부 그룹과 일치하려면 캡처 그룹을 추가할 수 있습니다. 표현식 끝까지:

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

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

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