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嵌套圆括号在一种情况下不起作用

*字符是贪婪的,它会尽可能多地匹配,这就是为什么第二个)字符是匹配的。

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

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

它将匹配(2c)示例。


或者,您可以在(?<=-DEPTH>)|.)*?中的*之后添加?,以便*是惰性的,并且.将尽可能少地匹配。

Regex.Matches(st, @"(?<='/)'((?>'((?<DEPTH>)|')(?<=-DEPTH>)|.)*?(?(DEPTH)(?!))')")

它也将匹配(2c)——例如。

相关文章: