正则表达式:匹配多个平衡组
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:)
捕获方法签名中的几行(如果有的话)。如果我的回答有帮助,也请考虑点赞。以上是关于正则表达式:匹配多个平衡组的主要内容,如果未能解决你的问题,请参考以下文章