>Java >java지도 시간 >Regex에서 재귀 또는 균형 그룹 없이 중첩된 괄호를 일치시키는 방법은 무엇입니까?

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

Susan Sarandon
Susan Sarandon원래의
2024-10-24 11:59:021039검색

How to Match Nested Brackets Without Recursion or Balancing Groups in Regex?

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

재귀 또는 균형 그룹 없이 중첩 괄호 일치 문제는 부족한 정규식을 사용할 때 발생합니다. 이러한 기능. 정규식은 일반적으로 중첩 구조를 처리하는 데 적합하지 않기 때문에 이 작업은 독특한 과제를 제시합니다.

전방 참조를 사용하여 퍼즐 풀기

이 문제에 대한 솔루션 중첩된 괄호 내의 하위 문자열을 캡처하기 위해 전방 참조를 사용하는 작업이 포함됩니다. 다음 정규식은 이를 수행합니다.

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

표현식 분석

이 복잡한 표현식은 중첩된 괄호 그룹과 일치하도록 함께 작동하는 여러 구성 요소로 구성됩니다.

  • 여는 괄호에 대한 긍정적 예측: (?=(). 이는 존재하는 경우에만 '('를 일치시키고 사용합니다.
  • 그룹 반복: (?:...) ?. 이 그룹은 문자열을 반복하여 여러 균형 그룹을 일치시킵니다.
  • 중첩된 여는 괄호 식별: (?=.*?((? !.*?1) 이는 캡처된 하위 문자열 1이 앞에 오지 않는 '('의 다음 항목과 일치하므로 동일한 '('가 다시 일치하지 않습니다.
  • 캡처 괄호 안의 하위 문자열: (.*)(?!.*2).*. 이는 캡처된 하위 문자열 2가 뒤에 나오지 않는 일치하는 '('와 다음 ')' 사이의 문자열 부분을 캡처합니다.
  • 중첩된 닫는 괄호 식별: (?=.*?)(?!.*?2) 이는 캡처된 하위 문자열이 앞에 나오지 않는 다음 ')' 항목과 일치합니다. 2, 다시 중복되지 않는 일치를 보장합니다.
  • 나머지 하위 문자열 캡처: (.*). 이는 일치하는 ')' 뒤와 다음 '(' 또는 문자열 끝 앞의 문자열의 나머지 부분을 캡처합니다.
  • 문자 일치 및 사용: . 이는 단일 문자를 사용합니다. , 그룹이 계속 일치하도록 허용합니다.
  • 최종 확인: .*?(?=1)[^(]*(?=2$). 이는 마지막 확인을 확인하고 확인합니다. 일치하는 '(' 및 ')'는 균형 잡힌 그룹을 형성합니다.

이러한 구성 요소를 활용하여 표현식은 문자열 끝에 도달할 때까지 매 반복마다 중첩된 괄호 그룹과 일치합니다.

추가 참고 사항

여기에 제공된 솔루션은 JavaScript와 같이 전방 참조를 지원하지 않는 버전의 경우 이 기술을 직접 적용할 수 없습니다.

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

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