我正在搜索正则表达式以匹配文本中的所有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,你不能再提取单个方法 - 体对了。
如何修改正则表达式以匹配多种方法?
答案 0 :(得分:2)
假设您只想匹配问题中的那些示例之类的基本代码,您可以使用
(?<method_name>\w+)\s*\((?s:.*?)\)\s*(?<method_body>\{(?>[^{}]+|\{(?<n>)|}(?<-n>))*(?(n)(?!))})
请参阅demo
要访问所需的值,请使用.Groups["method_name"].Value
和.Groups["method_body"].Value
。