Regex嵌套圆括号在一种情况下不起作用
本文关键字:一种 情况下 不起作用 嵌套 圆括号 Regex | 更新日期: 2023-09-27 18:28:04
在正则表达式中使用C#分组构造可以匹配嵌套圆括号内的内容,如此响应所示。以下代码正确返回(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)(?!))')"
,以只获得前面有/
的括号时,我希望只获得(2c)
,但我得到的是带有额外)
的(2c))
我缺少什么注意:如果我的输入字符串是Test(b)/(2c) some (abc) test.
,那么我的新模式正确地只返回(2c)
。
*
字符是贪婪的,它会尽可能多地匹配,这就是为什么第二个)
字符是匹配的。
为了避免这种情况,您可以将.
更改为[^)]
以匹配所有非)
字符:
Regex.Matches(st, @"(?<='/)'((?>'((?<DEPTH>)|')(?<=-DEPTH>)|[^)])*(?(DEPTH)(?!))')")
它将匹配(2c)
示例。
或者,您可以在(?<=-DEPTH>)|.)*?
中的*
之后添加?
,以便*
是惰性的,并且.
将尽可能少地匹配。
Regex.Matches(st, @"(?<='/)'((?>'((?<DEPTH>)|')(?<=-DEPTH>)|.)*?(?(DEPTH)(?!))')")
它也将匹配(2c)
——例如。