当我的RegEx被执行并且不匹配输入时,浏览器选项卡卡住

Browser tab stucks when my RegEx is executed and do not match the input

本文关键字:浏览器 选项 卡卡 输入 不匹配 RegEx 我的 执行      更新时间:2023-09-26

下一个问题。我创建了一个具有验证的输入字段,这是有效数据:

  1. 1-12、14、16、22、25-35、41、49、55-90
  2. 1230- 1992,2001 -2099, 9931
  3. 1 - 2
  4. 13
  5. 1, 3, 4, 5, 6, 10

基本上,这些数字的任何组合(范围,逗号分隔的范围,逗号分隔的数字,逗号后面有空格,逗号后面没有空格,word: 'all')

我的正则表达式:/^ (([0 - 9] {0, 4}, {0} ' s) + ([0 - 9] {1 4} [0 - 9] {1 4}) {0}, ? ' s{0}) + $ | ^(全部)$ | ^ ([0 - 9]{1 4}[0 - 9]{1 4}){0},?美元' s {0}/

它工作得很好,只有一个主要问题。

当我开始打字时,在一些逗号分隔的数字之后,我添加了一些无效的东西,比如字符:'abc' -此时我的浏览器选项卡卡住了。

测试:http://jsfiddle.net/c9ahfhqy/

有什么建议如何正确的RegEx应该看起来像?

代码:

    $("input[type='text']").blur(function() { //when you lose focus on input
      doneTyping();
    });
    function doneTyping() {
      if(!$('#inputToCheck').val().match(/^(([0-9]{0,4},?'s{0,})+([0-9]{1,4}'-[0-9]{1,4}){0,},?'s{0,})+$|^(all)$|^([0-9]{1,4}'-[0-9]{1,4}){0,},?'s{0,}$/)) {
        console.log("Not Valid");
      } else {
        console.log("Valid");
      }
    }

非常感谢你的帮助。

正如@derp所说,你的regex有灾难性回溯的问题。

下面这个似乎可以像你想要的那样工作,并且不会冻结浏览器:

/^(?:all|'d{1,4}(?:-'d{1,4})?(?:,'s*'d{1,4}(?:-'d{1,4})?)*)$/

使用RegexBuddy的调试器测试1-12, 14, 16, 19, 20-29, was

  • 您的正则表达式在尝试1000000步后失败,出现以下错误:

    你的正则表达式太复杂,无法继续调试。
    您计划使用它的正则表达式引擎可能无法处理它所有和崩溃。
    在帮助文件中查找"灾难性回溯",了解如何避免这种情况。

  • 上面的正则表达式在96步后失败,没有错误