匹配以下
时,我有一个问题Functiona(Functionb(a, b, c)) + Functionc(Functionb(d, e))
我只想提取Functiona(...), Functionb(...), Functionc(...)
我尝试过Function[a-z]\(\w+\)*
,但结果不符合预期。有人会纠正这种模式吗?预先感谢。
答案 0 :(得分:1)
您可以基于balancing groups construct使用正则表达式:
(?=(?<res>\bFunction[A-Za-z]\((?:[^()]*|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)))
外部前瞻用于启用重叠匹配,因为它使regex引擎测试字符串内的每个位置。一旦匹配了超前模式,它将被推到组res
上,并且可以从matchObj.Groups["res"].Value
访问这些值。
详细信息
\b
-单词边界Function
-文字[A-Za-z]
-ASCII字母\(
-一个(
(?:[^()]*|(?<o>)\(|(?<-o>)\))*
-除(
和)
,(
(已被推到组o
堆栈之外的0个以上的0个字符的零个或多个出现),)
(从o
组堆栈中弹出)(?(o)(?!))
-如果组o
不为空,则有条件检查将使匹配失败\)
-外部)
。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] )))
根据评估字符串的位置/方式,您可以简单地进行两次遍历,每个遍历一个模式,然后进行识别的匹配。这不是一个很好的解决方案,但可以识别所有可能的匹配项。