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

问题描述

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

  • (8)
  • (8,)
  • ( 8'' )
  • (8,9,8,9)
  • (18,9',89;)
  • (' 7; 27; 37.38; 48 ; 55)

但不是:

  • (8j)
  • (a888)
  • (1,2; 12.13; 25.26; 35.36; 43.45; 52.56; 59,6o)

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

解决方法

您可以将正则表达式更改为 \([\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()]+ 匹配 1+ 次除字符 A-Z a-z ( ) 之外的任何字符,如果您想扩展它,请添加更多
  • \) 匹配 )

Regex demo