为什么这个正则表达式使Chrome挂起

Why does this regex make Chrome hang?

本文关键字:Chrome 挂起 正则表达式 为什么      更新时间:2023-09-26

试着在Chrome的JS控制台输入这个。这是一个正则表达式,我发现检查是否有一个有效的URL:

"http://www.kvraudio.com/".match(/^(https?:'/'/)?(['da-z'.-]+)'.([a-z'.]{2,6})(['/'w '.-]*)*'/?$/);

返回匹配项,就像它应该的那样。现在试试这个:

"tp:/www.kvraudio.com/forum/viewtopic.php".match(/^(https?:'/'/)?(['da-z'.-]+)'.([a-z'.]{2,6})(['/'w '.-]*)*'/?$/);

返回Null,因为它不匹配。现在…试试这个:

"http://www.kvraudio.com/forum/viewtopic.php?p=5238905".match(/^(https?:'/'/)?(['da-z'.-]+)'.([a-z'.]{2,6})(['/'w '.-]*)*'/?$/);

!JS似乎是死的或陷入循环不知何故。如果我在一个实际的网页中使用上述方法,它会停止响应。甚至不会滚动!有人对此有什么解释吗?我做错了什么?!

因为你有灾难性的回溯:

(['/'w '.-]*)*

这个表达式应该修改为删除一个星号(*):

(['/'w '.-]*)

注意,灾难性回溯通常只有在无法匹配时才会出现。这就是为什么你给出的第一个例子执行起来没有任何问题。

第二个示例在到达([...]*)*之前退出,因此没有机会使回溯生效。

有关灾难性回溯的更详细解释,请参阅我对这个问题的回答:
我如何识别一个邪恶的正则表达式?