问题描述
使用这个正则表达式:\((\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 ( ) 之外的任何字符,如果您想扩展它,请添加更多 -
\)
匹配)