【问题标题】:Regex: Match multiple balancing groups正则表达式:匹配多个平衡组
【发布时间】:2015-11-13 18:52:18
【问题描述】:

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

上面的 C# 正则表达式仅在文本中恰好存在 ONE 方法时才会给出所需的结果。

原文:

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;
 }

如果只有method1包含在source中,它可以完美运行,但是附加method2只有一个Match,你不能再提取单独的method-body对了。

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

【问题讨论】:

  • 如果中间有包含{} 的cmets 怎么办?还是包含大括号的字符串文字?那么,这种方法就无效了。
  • 你能解释一下你想准确捕捉什么吗? Content 是方法的内容,Open 是什么?需要方法定义吗?
  • @Lamour:看我的编辑
  • @stribizhev:太好了!你可以把它作为答案。事实上,我不是在寻找通用解决方案或解析器来找到所有类型的方法,我知道我的文本中可能会出现什么结构。

标签: c# regex regex-group


【解决方案1】:

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

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

demo

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

【讨论】:

  • 我稍微缩短了平衡结构名称以减小模式大小。我还确保通过内部单行修饰符(?s:) 捕获方法签名中的几行(如果有的话)。如果我的回答有帮助,也请考虑点赞。
猜你喜欢
  • 2010-10-07
  • 2012-11-21
  • 2020-02-09
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多