为什么这个正则表达式使Chrome挂起
Why does this regex make Chrome hang?
试着在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 '.-]*)
注意,灾难性回溯通常只有在无法匹配时才会出现。这就是为什么你给出的第一个例子执行起来没有任何问题。
第二个示例在到达([...]*)*
之前退出,因此没有机会使回溯生效。
有关灾难性回溯的更详细解释,请参阅我对这个问题的回答:
我如何识别一个邪恶的正则表达式?
相关文章:
- JavaScript执行暂时挂起页面
- 是定义的操作系统睡眠/挂起期间setTimeout的行为
- Chrome浏览器“;挂起”;同时在循环中执行AJAX请求
- fullcalendar在删除导致浏览器挂起的多个事件时速度较慢
- 应用将图表转换为图像的jqplot代码时Chrome挂起
- 如何在不使用Internet Explorer的情况下从未挂起的HTML文件执行程序
- MongoDB collection.find()查询挂起
- 使用子字符串方法时应用程序挂起的原因
- 如何在AngularJS中取消挂起的请求
- 从node.js应用程序调用Mongoose Model.save()时挂起
- Chrome,Safari在从本地存储读取时挂起,而Firefox很好
- IE 10 挂起 XMLHttpRequest 6 分钟,然后响应请求(使用 AngularJS 实现 CRSF)
- 挂起 JavaScript 键关闭事件
- jQuery替换挂起chrome
- 为什么一个带有UI的chrome扩展的本地消息主机会挂起
- jQuery Datepicker在重新单击输入字段时挂起(Chrome)
- 为什么这个正则表达式使Chrome挂起
- Express.js CRUD - GET在Chrome中删除后挂起
- FF+Firebug报错“正则表达式太复杂”,IE崩溃,Chrome挂起
- 在Chrome / Safari下载文件期间$ajax调用挂起,而不是在IE / Firefox中