Javascript 正则表达式模式在边缘情况下会导致灾难性的回溯
我有这两个简单的正则表达式模式来匹配这些存储中的url,但是当在带有边缘大小写的字符串url上运行时,它们会导致灾难性的回溯和冻结浏览器。这种逻辑在数千个随机请求上运行,因此灾难性回溯的可能性很高。有没有人知道我写这个正则表达式的方式可能有什么问题Javascript 正则表达式模式在边缘情况下会导致灾难性的回溯,javascript,regex,Javascript,Regex,我有这两个简单的正则表达式模式来匹配这些存储中的url,但是当在带有边缘大小写的字符串url上运行时,它们会导致灾难性的回溯和冻结浏览器。这种逻辑在数千个随机请求上运行,因此灾难性回溯的可能性很高。有没有人知道我写这个正则表达式的方式可能有什么问题 > ".*://.*.newegg.com/Product/Product.*" > ".*://.*.gamestop.com*.*Product-Variation*.*productDetailsRed
> ".*://.*.newegg.com/Product/Product.*"
> ".*://.*.gamestop.com*.*Product-Variation*.*productDetailsRedesign"
表达式中有太多贪婪的点模式。试着说得更详细一点:
\w+://[^/]*\.newegg\.com/Product/Product\S*
第二种模式:
\w+://[^\s/]*\.gamestop\.com\S*?Product-Variation\S*?productDetailsRedesign
见|
使用\S*?
匹配任何与空白不同的字符(尽可能少)
转义句点字符,因为它们是正则表达式元字符
如果您知道在一个匹配中两个子字符串之间不能有这样的字符,请使用
[^…]
求反字符类。该*
匹配任何字符0次或多次,并且将首先匹配到字符串的结尾。然后,它可以回溯到所有选项,看看它是否适合该模式的其余部分。使用另一个*
将添加更多可供探索的选项。如果没有匹配(边缘情况),它仍将尝试所有选项。请注意,如果有意,请确定,但请注意,m*
和n*
可以匹配0次或更多次am
或n