2013-02-15 3 views
0

오전 조금 붙어 누군가가 도울 수 있다면, 값 & 체크 Funtion2는 다음과 같은 문자열에서 {} 아래 참조 사이에 찾는 정규 표현식을 사용하려고 궁금 :정규 표현식 내부 포장 {}

AA \\*Funtion1 {5 + \\*Funtion2 {3} {4} + 6 } BB 

CC \\*Funtion2 {3} {\\*Funtion2 {3} {4} + 4} DD \\*Funtion2 {3} {4} EE 

AA \\*Funtion1 { \\*Funtion2 {3} {4} + \\*Funtion2 {3} {4} + 6 } BB 

2 경기를해야하지만 3을 계속 가져 가야합니다.

+1

우리가 볼 수있는 무엇을 잘못하고있는거야? –

+2

'기능'이 아닌 '기능'이 맞습니까? –

+0

@OndrejTucny 좋은 캐치, 하하. –

답변

0

Lookbehind를 사용해보십시오.

(?<=\{[^}]*)Funtion2 

이 앞에는 'Funtion2'을 발견 할 것이다 '{'하지만이없는 '}'여는 중괄호와 텍스트 사이.

그러나 여는 중괄호와 닫는 중괄호의 균형을 조정하지는 않습니다. 예제 텍스트에서 나는 이것이 문제가되는 것을 보지 못합니다.

이 다음과 같은 경우가 발생하면 모든 일치를 찾을 수 없게됩니다 : 그것과 개방 '{'사이 '}'가 있기 때문에

AA \\*Funtion1 { \\*Funtion2 {3} {4} + \\*Funtion2 {3} {4} + 6 } BB 

두 번째 'Funtion2'은 생략 될 것이다.

당신은 균형 잡힌 정규 표현식을 사용할 수 있지만 솔직히 말해서 이것은 나에게 구문 분석하는 것처럼 보입니다. 어쩌면 당신은 파서를 작성하고 regexes에 너무 의존하지 않는 것을 고려해야합니다.

+0

안녕하세요. 사이보그, 답장을 보내 주셔서 감사합니다. 나는 균형 잡힌 정규식을 살펴 보았고 조언을 해줄 수 있었다. 내가 옳은 줄을 알았습니까? (? <= \ {[^}] *) Funtion2 \ {(? :(. *?) |? \ {) | (? <-open> \})) + \} – Chris

+0

@Chris, 질문에. 그런 식으로 문제에 대해 더 많은 눈을 갖게되고 그것이 실제로 어디에서 읽을 수 없게됩니다. –

0

{3 + { whatever } }처럼 중괄호 안에 중괄호가 올까요? 함수 이름에 포함되지 않은 백 슬래시가 있습니까 (예 : \\*Funtion2)? 두 질문에 대한 답이 모두 '아니오'인 경우 균형 잡힌 그룹에 의지하지 않고도이 문제를 관리 할 수 ​​있어야합니다. 예를 들면 :

Regex r = new Regex(@"\{[^{}\\]*\\\\\*Funtion2(?:[^{}\\]+\{[^{}\\]+\})*[^{}\\]*\}"); 
foreach (Match m in r.Matches(source) 
{ 
    Console.WriteLine(m.Value); 
} 

결과 :

{5 + \\*Funtion2 {3} {4} + 6 } 
{\\*Funtion2 {3} {4} + 4} 

아래로 정규식을 깨고, 우리가 가진 :

당신이 현재 그렇게 사용하는 정규식을 제공 할 수
\{    # the opening brace 
[^{}\\]*  # optional stuff preceding the function name 
\\\\   # the two backslashes 
\*    # the asterisk 
Funtion2  # and the name 
(?:    # in a loop... 
    [^{}\\]+  # stuff preceding the next opening brace 
    \{[^{}\\]+\} # a balanced pair of braces with non-braces in between 
)*    # loop zero or more times 
[^{}\\]*  # optional stuff preceding the closing brace 
\}    # the closing brace