2009-11-24 9 views
0

.NET에서 정규 표현식을 작성하여 이와 비슷한 모양의 함수 목록에서 전체 함수를 캡처하려고합니다. 정규 표현식, 역 참조 또는 대체 구조

public string Test1() 
{ 
    string result = null; 
    foreach(var item in Entity.EntityProperties) 
    { 
     result +=string.Format("inner string with bracket{0}", "test"); 
    } 
    return result; 
} 
public string Test5() 
{ 
    return string.Format("inner string with bracket{0}", "test"); 
} 

public string Last() 
{ 
    return string.Format("inner string with bracket{0}", "test"); 
} 

그래서 나는 마지막 기능 제외한 모든를 캡처합니다
((?<function>public string (?<fName>\w+)\(\)\s*{.*?})(?=\s*public string)) 

있어 ... 또는이

((?<function>public string (?<fName>\w+)\(\)\s*{.*?})(?=\s*(public string)|$)) 

이 첫 번째를 제외하고 정확하게 모든 기능을 일치합니다. 첫 번째 기능은 부분적으로 만 일치합니다.

public string Test1() 
{ 
    string result = null; 
    foreach(var item in Entity.EntityProperties) 
    { 
     result +=string.Format("inner string with bracket{0}", "test"); 
    } <-- the first capture only get to this point. 

아이디어가 있으십니까? 가능한 경우 설명을 입력하십시오.

+0

무엇이 맞습니까? Regexes는 임의로 중첩 된 중괄호를 잘 처리하지 않습니다. –

답변

1

실제로 .NET에서 일치하는 대괄호를 확인하는 것이 가능합니다. 핵심은 균형 조정 그룹을 사용하는 것입니다. 나는 그 질문을 듣기 전에 들어 봤다. 나는 표현의 글을 쓰는 방법을 모르므로 레지던트 전문가가 도와 주길 바랬다. :)

운 좋게도이 웹 사이트를 찾았습니다. 어떤 세부 사항에서 균형 그룹을 설명 ... 그는 심지어 템플릿을 제공합니다. 그래서 여기에 모든 사람들이 참조 할 수 있습니다.

http://blog.stevenlevithan.com/archives/balancing-groups 패턴의 요점은 여기

{ 
    (?> 
     (?! { | }) . 
    | 
     { (?<Depth>) 
    | 
     } (?<-Depth>) 
    )* 
    (?(Depth)(?!)) 
} 

하지만 세부 사항에 대한 설명은 자신의 블로그를 체크 아웃.

+1

질문 제목에서 무엇을하려고했는지 더 좋은 결과를 얻었을 수도 있습니다. –

+0

당신 말이 맞습니다.이 같은 타이틀에 대해 어떻게 생각하십니까? C# 소스 코드에서 함수 본문을 캡처하려면 정규식이 필요합니까? – firefly

1

정규 표현식을 많이 좋아하지만, 중첩 구조가 "일반"이 아니므로 정규 표현식과 일치 할 수 없기 때문에 정규식을 많이 좋아합니다. 이런 종류의 일에 파서가 필요합니다. 죄송합니다.