2014-08-28 4 views
0

모든 중괄호가 올바르게 일치하는 경우에만 일치하는 정규 표현식을 찾고 있습니다. 일치하는 중괄호는 중첩 될 수 있습니다.중괄호를 일치시키는 정규식

Ex. 일치하는

  • 헬로 {0} {}
  • 안녕하세요 다음 {0} {{오브젝트 1}}, {{Object2}}
  • 테스트 {{1} {{2} {{ 3} {{4}}}}}

비 일치

  • } {안녕하세요 {0}
  • {{} 안녕하세요에 다음 {0} : {{Objec T1은}}, {{Object2}}
  • 테스트는 {{1} {{2} {{3} {{4} {}는 계산 balancing groups을 사용할 수 있습니다 .NET에서
+0

어떤 언어로 제공됩니까? 대부분의 언어는 중첩 된 정규 표현식을 지원하지 않으므로 일련의 함수로이를 수행해야합니다. –

+0

@ wolffer-east : 저는 VB에서하고 있습니다. 순수 정규식 구문을 사용하여 해결할 수 있기를 바랐습니다. 당신이 'most'라고 말할 때, 그것은 어떤 사람들이하는 것을 의미합니까? –

+0

중첩 된 패턴과 일치시키는 데 정규식을 사용할 수 있습니까? (http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns) –

답변

2

, 당신을 허용하는 이러한 문제를 해결하기 위해. 예를 들어

{} 당신이 같은 표현을 사용할 수 있습니다 조화를 이루어야합니다 :

(?x)^ 
[^{}]* 
(?: 
    (?: 
    (?'open' \{)  # open++ 
    [^{}]* 
)+ 
    (?: 
    (?'close-open' \}) # open--, only if open > 0 
    [^{}]* 
)+ 
)* 
(?(open) (?!))   # fail if open != 0 
$ 
+1

다음은 몇 가지 유사한 예입니다. http://stackoverflow.com/questions/15752778/regex-w- 밸런싱 - 그룹 - 그 - 일치 - 유일한 - outmost - 일치/15753431 # 15753431 http://stackoverflow.com/questions/17003667/match-text-surrounded-by-and/17003704#17003704 – Qtax

+0

굉장! 고마워, 나는 내 실험에 대해 이걸 시험해 보았고 그것은 비행 색으로 통과했다. 간단하게 놀랍습니다. 나는 그것의 1 비트를 이해하지 않는다. 그래서 나는 약간의 독서를하기 위해 추측한다! –

2
bool BracesMatch(string s) 
{ 
    int numOpen = 0, numClosed = 0; 
    foreach(char c in s.ToCharArray()) 
    { 
    if (c == '{') numOpen++; 
    if (c == '}') numClosed++; 
    if (numClosed > numOpen) return false; 
    } 
    return numOpen == numClosed; 
} 
+0

이거 봤어?"if (numClosed> numOpen) false를 반환합니다." – Derek

+2

@Tensibai 그는 각 문자에'if (numClosed> numOpen)가 false를 반환합니다. '를 검사하므로 예제가 통과하지 못합니다. http://ideone.com/JUkyLZ – nodakai

+0

제 잘못으로 모든 것을 읽지 못했습니다. 내 +1 가져 가라. – Sam

0

이뿐만 아니라 닷넷 균형 그룹을 사용하여 작동 할 수 있습니다.

# @"^[^{}]*(?:\{(?>[^{}]+|\{(?<Depth>)|\}(?<-Depth>))*(?(Depth)(?!))\}[^{}]*)*[^{}]*$" 

^ 
[^{}]*      # Anything (but only if we're not at the start of { or }) 
(?: 
     \{       # Match opening { 
     (?>       # Then either match (possessively): 
      [^{}]+      # Anything (but only if we're not at the start of { or }) 
     |        # or 
      \{       # { (and increase the braces counter) 
      (?<Depth>) 
     |        # or 
      \}       # } (and decrease the braces counter). 
      (?<-Depth>) 
    )*       # Repeat as needed. 
     (?(Depth)      # Assert that the braces counter is at zero. 
      (?!)       # Fail this part if depth > 0 
    ) 
     \}       # Then match a closing }. 
     [^{}]*      # Anything (but only if we're not at the start of { or }) 
)*       # Repeat as needed 
[^{}]*      # Anything (but only if we're not at the start of { or }) 
$ 
관련 문제