2014-02-23 1 views
1

제목이 모호하게 들릴 수도 있지만 계속해서 읽으십시오.Regex는 구분할 동일한 문자가 포함 된 두 문자 사이의 문자열을 일치시킵니다.

의 내가이 문자열을 있다고 가정 해 봅시다 :

TestBlock1 { NestedBlock1.1 { 
     Text = Text } } 
TestBlock2 { NestedBlock2.1 { 
     Text = Text } NestedBlock2.2 { 
     Text = Text } } 

내가 BlockName {...}로 문자열과 일치 할 수 있어야합니다. 이것은 내가 시도한 것입니다 :

[\w]+\s*{\s*[^.]+\s*} 

아이디어는 배열로 일치를 얻는 것입니다.

string[] block; 
block[0] = TestBlock1 { NestedBlock1.1 { Text = Text } } 
block[1] = TestBlock2 { NestedBlock2.1 { Text = Text } NestedBlock2.2 { Text = Text } } 

문제는 전체 문자열을 가져 오는 것입니다. "분리 문자"문자가 포함 된 두 문자 사이에 문자열을 가져 오는 것이 원격으로 가능합니까?

(재귀 정규 표현식에를 지원) .NET에서
+0

를 사용할 수 있습니다. 파서를 작성해야 할 수도 있습니다. – arshajii

+0

어떤 정규식 엔진을 사용하고 있습니까? (이것은'regex' 태그가 붙은 모든 질문에 대한 필수 정보입니다.) 일부 최신 엔진은 재귀를 지원합니다. –

+0

@Tim : 현재로서는 regexpal.com을 사용하여 테스트하고 있지만 최종 사용법은 C#이 될 것입니다. – TacticalNinja

답변

0

, 당신은 당신이 중첩 된 구조에 맞게 표준 정규 표현식을 사용할 수 없습니다

Regex regexObj = new Regex(
    @"\w+\s+  # Match identifier 
    \{    # Match { 
    (?>    # Then either match (possessively): 
    (?:   # the following group which matches 
     (?![{}])  # only if we're not before a { or } 
     .    # any character 
    )+    # once or more 
    |    # or 
    \{ (?<Depth>) # { (and increase the braces counter) 
    |    # or 
    \} (?<-Depth>) # } (and decrease the braces counter). 
    )*    # Repeat as needed. 
    (?(Depth)(?!)) # Assert that the braces counter is at zero. 
    \}    # Then match }.", 
    RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline); 
+0

나는 이것을 시도해 보겠습니다. 나는 이것이 중복 질문이 아니라면 * 거의 * 실현하지 않았다 [link] (http://stackoverflow.com/questions/14407821/c-sharp-regex-how-to-remove-multiple-paired-parentheses- 에서 - 문자열)도 당신에 의해 답변. – TacticalNinja

+0

감사합니다. 지금 일하고있어. – TacticalNinja