2008-10-08 4 views
1

.NET balanced group regexes 내 머리가 폭발합니다..NET Regex 밸런싱 그룹 표현식 - 균형이 맞지 않을 때 일치합니다.

다음
other stuff blah blah.... 
        { 
         stuff stuff 
         {key: 
          stuff 
          stuff 
         } 
        } more stuff..... 

내 정규식입니다 : 내가 일치하도록 노력하고있어이 문자열있어 그래서

[^{}]*      # anything that isn't { } 
\{       # starting with { 
(?>       # atomic group: throw away backtracks on exit 
    [^{}]+ 
    | 
    \{(?:\w+:)?(?<DEPTH>) # on matching { plus optional "word:" push stack 
    | 
    \}(?<-DEPTH>)   # on matching } pop stack 
)* 
(?(DEPTH)(?!))    # if depth unbalanced, fail match 
\}       # ending with } 
[^{}]*      # anything that isn't { } 

을, 나는, 중괄호 균형과 일치하기 위해 노력하고있어 어디 여는 중괄호의 일부 선택적 단어 뒤에 콜론이옵니다. 위의 정규식 내 예를 들어 문자열과 일치,하지만 난이 중괄호를 제거하는 경우 (즉, "그것을 불균형) :

other stuff blah blah.... 
        { 
         stuff stuff 
         {key: 
          stuff 
          stuff 

        } more stuff..... 

... 여전히 일치

는 사람이 어떻게 내 정규식을 해결하는 방법을 말해 줄래! ?

+1

나는 당신의 정규 표현식을 해설했다. 그냥'RegexOptions.IgnoreWhitespace'로 호출하십시오. 폭발 헤드 증후군을 피하는 데 매우 도움이됩니다. –

+0

@Jeff :'(? x) # IgnorePatternWhitespace' 패턴으로'IgnoreWhitespace' 규칙을 만들 수 있습니다. 예를 보려면 http://stackoverflow.com/questions/1961369/net-regex-parsing-of-the-newline-character/1961577#1961577을 참조하십시오. –

답변

4

두 번째 경우에 무엇이 일치하는지 확인 했습니까? 너는 앵커가 없기 때문에, 엔진은 첫 번째 '{'다음에 시작한다. 거기에서 끝까지 문자열이 일치합니다.

패턴을 \ A와 \ z로 둘러보십시오.

-1

당신이 정규 표현식을 사용하여 시도하는 것은 단순히 불가능하기 때문에 마음을 깜짝 놀라게하는 것입니다. 정규식은 유한 오토마타 클래스이며 다음과 같은 상태가 아닙니다. 재귀 적/중첩 된 일치를 수행합니다.이 작업을 수행하려면 문맥이없는 문법이 필요합니다.

재귀라는 개념을 지원하는 정규 표현식 엔진이 있습니다. 이것들은 엄밀히 말하면 정규 표현식을 말하는 것은 아닙니다. 이 시나리오를 돕는 재귀 함수가있을 가능성이 있기 때문에 어떤 엔진을 사용하고 있는지 말해 줄 수 있습니까?

+4

제목 줄에는 .NET Regex가 있습니다. 나는 엔진이 그것을 지원한다는 것을 이미 알고있다. http://blog.stevenlevithan.com/archives/balancing-groups를 참조하십시오. –

관련 문제