正则表达式如何忽略多个()?

时间:2018-11-14 20:18:22

标签: regex

我正在使用此正则表达式字符串:

/rfi .*?(.*) .*?\((.*)\)/i

第1组找到rfi号,第2组返回()内的内容。 使用测试字符串:“ 新RFI 087(播种机处的混凝土梁)”,一切正常, 但使用测试字符串“ 新RFI 087(在Planter的混凝土(梁))”时,则崩溃。

反正在()内部进行搜索,但忽略其中的多个()吗?

1 个答案:

答案 0 :(得分:2)

您可以通过使组1模式变得懒惰来匹配字符串。另外,第一个.*?是多余的,请将其删除。

使用

/rfi (.*?) .*?\((.*)\)/i

请参见regex demo

@sln建议使用带有子例程的正则表达式,但是这些功能在正则表达式引擎中并不流行,例如Ruby Onigmo或PCRE支持它们。

/rfi (.*?) .*?(\((?:[^()]++|(?2))*\))/i

或者更多的“跨库”(因为Onigmo支持\g<X>递归构造,与PCRE相同)

/rfi (.*?) .*?(\((?:[^()]++|\g<2>)*\))/i

请参见this demo