>백엔드 개발 >C++ >정규식을 사용하여 문자열에서 균형이 맞는 괄호만 일치시키려면 어떻게 해야 합니까?

정규식을 사용하여 문자열에서 균형이 맞는 괄호만 일치시키려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-16 15:27:10840검색

How Can I Use Regular Expressions to Match Only Balanced Parentheses in a String?

정규식 팁: 균형 괄호의 완벽한 일치

프로그래밍 세계에서는 균형 잡힌 괄호가 코드 무결성을 보장하는 데 매우 중요합니다. 정규식(RegEx)은 대괄호 쌍을 식별하고 검증하는 강력한 메커니즘을 제공합니다. 그러나 대괄호를 정확하게 일치시키는 정규식을 만드는 것은 복잡한 작업이 될 수 있습니다.

다음 정규 표현식을 고려해 보세요.

<code>func([a-zA-Z_][a-zA-Z0-9_]*)\(.*\)</code>

이 표현식은 "funcPow((3),2) * (9 1)" 문자열과 일치하도록 설계되었습니다. 이상적으로는 "funcPow((3),2)"만 선택해야 하지만 현재는 마지막 닫는 괄호까지 모든 것을 캡처하므로 일치 항목이 예상과 다릅니다.

균형 매칭 솔루션:

이 문제를 해결하려면 정규식의 강력한 기능(삭제 캡처)을 활용하는 고급 구현이 필요합니다. 다음 수정된 표현식은 균형 잡힌 대괄호 일치를 달성하는 방법을 보여줍니다.

<code>var r = new Regex(@"
    func([a-zA-Z_][a-zA-Z0-9_]*) # 函数名

    \(                      # 开括号
        (?:                 
        [^()]               # 匹配所有非括号字符
        |
        (?<open> \( )       # 匹配'(', 并捕获到名为'open'的组中
        |
        (?<-open> \) )      # 匹配')', 并删除'open'组中的相应捕获
        )+
        (?(open)(?!))       # 如果'open'堆栈不为空,则匹配失败

    \)                      # 闭括号
", RegexOptions.IgnorePatternWhitespace);</code>

균형 매칭 하위 그룹 설명:

균등 괄호의 핵심은 다음 하위 그룹에 있습니다.

  • (? ( ): 여는 괄호를 "open"이라는 명명된 캡처 그룹으로 캡처합니다.
  • (?<-open> ) ): 닫는 괄호를 일치시키고 해당 "open" 캡처를 제거합니다.

캡처 절 없음: (?(open)(?!))

이 조건식은 "열기" 캡처가 비어 있지 않은 경우 안전 메커니즘으로 사용됩니다. "열린" 캡처가 여전히 존재하는 경우, 즉 일치하지 않는 여는 괄호가 있음을 의미하며 표현식 일치가 실패합니다.

이러한 기술을 결합하면 대괄호와 정확하게 일치하고 원하는 일치 항목을 반환하는 정규식을 만들 수 있습니다.

<code>"funcPow((3),2)"</code>

정규식의 고급 기능을 익히면 대괄호와 같은 복잡한 문자열 처리 문제를 우아하고 효율적으로 해결할 수 있습니다.

위 내용은 정규식을 사용하여 문자열에서 균형이 맞는 괄호만 일치시키려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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