这段 js 正则,为何会导致浏览器卡死?

var str = 'aaaaaaaaaabbbbbbbbbbcccccccccc(';

// 运行下面代码,浏览器会卡死,为何?
if (!/^\s*[a-zA-Z0-9]+(\s*[a-zA-Z0-9]+)*\s*$/.test(str)) {
    alert('请输入英文');
}

// 奇怪的现象:如果把字符串中 cccccccccc 去掉,就没事了,怎么回事?

补充下需求:只允许内容是【字母、数字、空格】组合,但不能全部都是空格。

阅读 8.7k
6 个回答
  if(!/(?!^\s*$)^[a-zA-Z0-9\s]*$/.test(str))
  {
     alert('请输入英文');
  }

回溯太严重,不推荐使用嵌套的数量符号

问题出在(s[a-zA-Z0-9]+)这里,这种形式需要回溯次数指数上升,回溯太多次了,所以卡死。把ccccccc去掉后就没事是因为长度减少后,回溯次数也相应减少,所以不会卡死。Python中执行re.match(r'^([a-zA-Z0-9]+)*$', 'aaaaaaaaaabbbbbbbbbbcccccccccc(')就可以看到卡死了。深入了解可以参考
一个错误的邮箱匹配正则表达式回溯测试

有些模式的正则会有严重的性能问题(所有可能的子串去匹配所有可能的子模式), 像不能全都是空格这种限制就不应该用正则.

function isValid(str) {
    if (str.trim() === '') {
        return false;
    }
    
    return /^[\sa-zA-Z0-9]+$/.test(str);
}

导致页面卡死的几种情况:1 无穷解, 感觉不太可能。 2.也有可能是假死,但假死一般就两种情况一种是自身代码书写的问题,还有就是网络的问题按你这个说法估计不可能是网络的问题。 3.从自身找原因吧,我估计是正则有问题,在匹配中有一种可能出现卡死的情况叫做贪婪匹配。具体是什么原因兄弟你结合我的分析下把,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题