正则表达式:匹配多个平衡组

时间:2015-08-20 08:16:16

标签: c# regex regex-group

我正在搜索正则表达式以匹配文本中的所有C#方法,并且每个找到的方法的正文(引用为"内容")应该可以通过组访问。

如果文本中只有一个方法,则上面的C#Regex只会提供所需的结果。

来源文字:

void method1(){

if(a){ exec2(); }   
else {  exec3(); }  

}

void method2(){

if(a){ exec4(); }   
else {  exec5(); }  

}

正则表达式:

string pattern = "(?:[^{}]|(?<Open>{)|(?<Content-Open>}))+(?(Open)(?!))";
MatchCollection methods  = Regex.Matches(source,pattern,RegexOptions.Multiline);
 foreach (Match c in methods)
 {
    string body = c.Groups["Content"].Value; // = if(a){ exec2(); }else {  exec3();}
    //Edit: get the method name
    Match mDef= Regex.Match(c.Value,"void ([\\w]+)");
    string name = mDef.Groups[1].Captures[0].Value;
 }

如果source中只包含method1,它可以很好地工作,但是使用额外的method2只有一个Match,你不能再提取单个方法 - 体对了。

如何修改正则表达式以匹配多种方法?

1 个答案:

答案 0 :(得分:2)

假设您只想匹配问题中的那些示例之类的基本代码,您可以使用

(?<method_name>\w+)\s*\((?s:.*?)\)\s*(?<method_body>\{(?>[^{}]+|\{(?<n>)|}(?<-n>))*(?(n)(?!))})

请参阅demo

enter image description here

要访问所需的值,请使用.Groups["method_name"].Value.Groups["method_body"].Value