正则表达式嵌套括号不适用于一种情况

时间:2015-12-25 00:36:36

标签: c# regex visual-studio .net-4.5.2

使用C#Grouping Constructs in Regular Expressions可以匹配嵌套括号内的内容,如this response所示。以下代码正确返回(b/(2c))(abc)

st = "Test(b/(2c)) some (abc) test.";
foreach (Match mt in Regex.Matches(st, @"\((?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!))\)"))
{
    Console.WriteLine(mt.Value);
}

但是,当我将模式更改为@"(?<=/)\((?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!))\)"时,只需在上述模式之前添加(?<=/),以便只获取前面带有/的括号,我希望只获得{{1}但我得到(2c)额外(2c))我缺少什么?注意:如果我的输入字符串为),那么我的新模式只会正确返回Test(b)/(2c) some (abc) test.

1 个答案:

答案 0 :(得分:3)

<style>字符为greedy,它会尽可能匹配,这就是第二个*字符匹配的原因。

为避免这种情况,您可以将)更改为.以匹配所有非[^)]字符:

)

匹配Regex.Matches(st, @"(?<=\/)\((?>\((?<DEPTH>)|\)(?<=-DEPTH>)|[^)])*(?(DEPTH)(?!))\)") - example

或者,您可以在(2c) ?之后添加*,以便(?<=-DEPTH>)|.)*?延迟,*将尽可能多地匹配。

.

它也会匹配Regex.Matches(st, @"(?<=\/)\((?>\((?<DEPTH>)|\)(?<=-DEPTH>)|.)*?(?(DEPTH)(?!))\)") - example