首页 > 解决方案 > 如何将正则表达式模式放在另一个正则表达式模式中而不会出现不匹配

问题描述

这是我的正则表达式模式(没有空格 atm):

(method)\((.*?),(.*?)\)|(print)\((.*?)\)

结果总是返回:

"method(a,print(hello world)"

代替:

"method(a,print(hello world))"

如何在保留外部括号的同时捕获所有内容?

标签: c#regex

解决方案


如果需要,这使用称为平衡组的特殊构造来实现递归并在方法中捕获多个嵌套级别。捕获的命令放在“命令”组内

var regex = new Regex(@"method
[(]
(?<action>\w+)\s*,\s*
(\s*
    (?<commands>\w+
    (;|
        ((?<open>[(])[^(]*?)+
        (?<close-open>[)])+
        (?(open)(?!))
    ))+
\s*)+
[)]", RegexOptions.IgnoreWhitespace | RegexOptions.ExplicitCapture);

这是正则表达式的永久链接。如果您在那里查看,您将看到下表:

在此处输入图像描述

如此处所见,正则表达式在第 2 行匹配了 4 个命令,其中动作为a,为了获得这些结果,您可以执行regex.Match(foo).Groups["commands"].Captures.Select(c => c.Value)


推荐阅读