为什么这个RegExp导致浏览器崩溃?

时间:2018-05-05 17:52:26

标签: javascript regex

我正在研究一个RegExp并发现如果该字符串包含dash aa-bb.js和查询字符串部分m=123,它将导致浏览器崩溃,除了不是最好的正则表达式为此,我想知道为什么它适用于https://example.org/aa.js而不适用于https://example.org/js/aa-bb.js?m=123

var re = /src=[\'|\"]([ -0-9a-zA-Z:]*[ 0-9a-zA-Z;]*)*[\'|\"]/g;
var result = re.exec("<script src='https://example.org/js/aa-bb.js?m=123'></script>");
console.log(result)

1 个答案:

答案 0 :(得分:1)

除了你的正则表达式还有其他问题,
你的错误就是这个(这可能导致崩溃):

Error: Regex Construction .. 

Invalid range end in character class

     src= [\'|\"] 
     (                             # (1 start)
          [ -0-<<<HERE>>>9a-zA-Z:]* 
          [ 0-9a-zA-Z;]* 
     )*                            # (1 end)
     [\'|\"]

在类中,范围<space> to 0,然后是没有起始字符的范围运算符。

其他问题:

此字符类[\'|\"]中包含一个替换字面值 你打算这样吗?

此外,您可以选择量化可选量词而不指定
非可选。< 如果你的课程内容重叠,那么这真的很糟糕 这是回溯溢出的一个秘诀。

示例([abcD]*[abc]*)*

总的来说,您可能需要的正则表达式为src=(['"])(?:(?!\1)[\S\s])*\1