> Java > java지도 시간 > 본문

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

Patricia Arquette
풀어 주다: 2024-10-25 02:37:02
원래의
437명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!