正则表达式具有复杂的模式

时间:2018-09-18 03:29:27

标签: c# regex

匹配以下

时,我有一个问题
Functiona(Functionb(a, b, c)) + Functionc(Functionb(d, e))

我只想提取Functiona(...), Functionb(...), Functionc(...)

我尝试过Function[a-z]\(\w+\)*

,但结果不符合预期。有人会纠正这种模式吗?预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以基于balancing groups construct使用正则表达式:

(?=(?<res>\bFunction[A-Za-z]\((?:[^()]*|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)))

请参见.NET regex demo

外部前瞻用于启用重叠匹配,因为它使regex引擎测试字符串内的每个位置。一旦匹配了超前模式,它将被推到组res上,并且可以从matchObj.Groups["res"].Value访问这些值。

详细信息

  • \b-单词边界
  • Function-文字
  • [A-Za-z]-ASCII字母
  • \(-一个(
  • (?:[^()]*|(?<o>)\(|(?<-o>)\))*-除()((已被推到组o堆栈之外的0个以上的0个字符的零个或多个出现),)(从o组堆栈中弹出)
  • (?(o)(?!))-如果组o不为空,则有条件检查将使匹配失败
  • \)-外部)

C# demo

var s = "Functiona(Functionb(a, b, c)) + Functionc(Functionb(d, e))";
    var pattern = @"(?=(?<res>\bFunction[A-Za-z]\((?:[^()]*|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)))";
    var result = Regex.Matches(s, pattern)
        .Cast<Match>()
        .Select(m => m.Groups["res"].Value)
        .ToList();
    Console.WriteLine(string.Join("\n", result));

输出:

Functiona(Functionb(a, b, c))
Functionb(a, b, c)
Functionc(Functionb(d, e))
Functionb(d, e)

答案 1 :(得分:-1)

您的字符串将通过以下两个正则表达式成功匹配:

Function [a-z]([a-zA-Z(,\ s +(] *)+

Function [a-z]([a-z,\ s] *)

无论出于何种原因,当我将它们包装在“或”中时,都无法识别这两个集合:

(Function [a-z]([a-zA-Z(,\ s +(] )+ | Function [a-z]([a-z,\ s] )))

根据评估字符串的位置/方式,您可以简单地进行两次遍历,每个遍历一个模式,然后进行识别的匹配。这不是一个很好的解决方案,但可以识别所有可能的匹配项。

相关问题