搜索括号中数字的灾难性回溯

Catastrophic backtracking searching for numbers in brackets

使用此正则表达式:\((\W*\d*\W*)*\) 我正在寻找括号内的数字。这些数字可以被任何符号包围,但不能被字符包围,并且这种模式可以在括号内出现很多次,我的意思是我需要匹配这里的所有内容:

但不是:

最后一个例子给了我一个灾难性的回溯错误。我怎样才能避免这个错误?我真的不明白怎么做...

您可以将正则表达式更改为 \([\W\d]*\),这将匹配和不匹配您的示例。

https://regex101.com/r/DNmuEb/1/

\((\W*\d*\W*)*\) 的灾难性回溯是由于嵌套的可选量词,一切都是可选的。

注意\W也可以匹配()

您可以匹配除字符 A-Z a-z 或括号之外的任何空白字符,如果您需要匹配所有字符,则在括号之间至少断言一个数字

\((?=[^()\d]*\d)[^A-Za-z()]+\)
  • \( 匹配 (
  • (?=[^()\d]*\d) 断言括号之间至少有一个数字
  • [^A-Za-z()]+ 匹配除字符 A-Z a-z ( ) 之外的任何字符 1 次以上,如果要扩展它,请添加更多
  • \) 匹配 )

Regex demo