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

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

Patricia Arquette
Patricia Arquette원래의
2024-10-24 12:25:02956검색

Can Nested Brackets Be Matched Without Recursion or Balancing Groups?

재귀 또는 균형 그룹 없이 중첩 괄호를 일치시키는 것은

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

외부 그룹 일치

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

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

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

내부 그룹 일치

내부 그룹을 포함하려면 다음 식을 캡처할 수 있습니다. [2]:

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

캡처링 그룹을 추가하고 역참조 인덱스를 조정하여 이 표현식은 내부 그룹도 캡처합니다.

작동 방식

이 메서드는 문자열을 반복하여 다음 여는 괄호와 닫는 괄호를 일치시키는 동시에 나머지 문자열을 각 경우에 캡처합니다. 예측은 괄호가 균형 있게 일치하는지 확인합니다.

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

Component Description
(?=() Asserts that '(' precedes complex parsing
(?: Start of non-capturing group for repeated string processing
(?= Assert that the next '(' follows
.?((?!.?1) Match until the next '(' not followed by group 1
(.)(?!.2).* Fill group 1 with the string, ensuring another ')' exists
) Assert that the matching ')' is valid
.?)(?!.?2) Assert that the next ')' not followed by group 2 exists
(.*) Fill group 2 with the remaining string
) Assert that the matching ')' is valid
Consume a single character to continue matching within the group
) ? Repeat the group (in the inner loop)
.*?(?=1) Match up to and including the last '(' found
1*(?=2$) Match up to the last ')' (but within the valid group)

이 방법을 사용하면 재귀 또는 균형 그룹 없이 중첩된 괄호를 효율적으로 일치시킬 수 있습니다.


  1. (

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

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