使用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.
。
答案 0 :(得分:3)
<style>
字符为greedy,它会尽可能匹配,这就是第二个*
字符匹配的原因。
为避免这种情况,您可以将)
更改为.
以匹配所有非[^)]
字符:
)
匹配Regex.Matches(st, @"(?<=\/)\((?>\((?<DEPTH>)|\)(?<=-DEPTH>)|[^)])*(?(DEPTH)(?!))\)")
- example。
或者,您可以在(2c)
?
之后添加*
,以便(?<=-DEPTH>)|.)*?
延迟,*
将尽可能多地匹配。
.
它也会匹配Regex.Matches(st, @"(?<=\/)\((?>\((?<DEPTH>)|\)(?<=-DEPTH>)|.)*?(?(DEPTH)(?!))\)")
- example。