搜索括号中数字的灾难性回溯
Catastrophic backtracking searching for numbers in brackets
使用此正则表达式:\((\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]*\)
,这将匹配和不匹配您的示例。
\((\W*\d*\W*)*\)
的灾难性回溯是由于嵌套的可选量词,一切都是可选的。
注意\W
也可以匹配(
和)
您可以匹配除字符 A-Z a-z 或括号之外的任何空白字符,如果您需要匹配所有字符,则在括号之间至少断言一个数字
\((?=[^()\d]*\d)[^A-Za-z()]+\)
\(
匹配 (
(?=[^()\d]*\d)
断言括号之间至少有一个数字
[^A-Za-z()]+
匹配除字符 A-Z a-z ( ) 之外的任何字符 1 次以上,如果要扩展它,请添加更多
\)
匹配 )
使用此正则表达式:\((\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]*\)
,这将匹配和不匹配您的示例。
\((\W*\d*\W*)*\)
的灾难性回溯是由于嵌套的可选量词,一切都是可选的。
注意\W
也可以匹配(
和)
您可以匹配除字符 A-Z a-z 或括号之外的任何空白字符,如果您需要匹配所有字符,则在括号之间至少断言一个数字
\((?=[^()\d]*\d)[^A-Za-z()]+\)
\(
匹配(
(?=[^()\d]*\d)
断言括号之间至少有一个数字[^A-Za-z()]+
匹配除字符 A-Z a-z ( ) 之外的任何字符 1 次以上,如果要扩展它,请添加更多\)
匹配)