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

Posted

技术标签:

【中文标题】正则表达式:匹配多个平衡组【英文标题】: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对了。

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

【问题讨论】:

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

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

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

见demo

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

【讨论】:

我稍微缩短了平衡结构名称以减小模式大小。我还确保通过内部单行修饰符(?s:) 捕获方法签名中的几行(如果有的话)。如果我的回答有帮助,也请考虑点赞。

以上是关于正则表达式:匹配多个平衡组的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中 如何取出所有组中的值?

将字符串匹配到多个正则表达式模式并返回组号

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

正则表达式:如何访问一个组的多个匹配项? [复制]

如何用正则表达式替换多个匹配项/组?

在 PySpark 中提取多个正则表达式匹配项