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

标签 javascript regex web browser backtracking

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

  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
  6. 全部

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

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

它几乎可以正常工作,只有 1 个主要问题。

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

试试这个作为输入:1-12, 14, 16, 19, 20-29, was

要测试的 fiddle :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 said ,你的正则表达式有一个问题 Catastrophic Backtracking .

下面的看起来像你想要的那样工作,并且不会卡住浏览器:

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

Demo

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

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

    Your regular expression is too complex to continue debugging.
    The regex engine you plan to use it with may not be able to handle it at all and crash.
    Look up "catastrophic backtracking" in the help file to learn how to avoid this situation.

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

关于javascript - 当我的 RegEx 被执行并且与输入不匹配时,浏览器选项卡卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25433413/

相关文章:

java - 正则表达式替换但保留字符串的一部分

javascript - 如何用 HTML/JavaScript 实现自定义代码编辑器?

javascript - 在 javascript 中添加其他文本框值之前如何避免文本框中出现 NaN

javascript - 获取 CSS 位置转换不对窗口缩放使用react

Java 正则表达式 后向查找

PHP:JSON 中的正则表达式导致 json_decode 出现问题?

javascript - 在索引之间搜索

javascript - 有了 HTML 表格,如何使用 HTML、CSS 和 JavaScript 在仅显示特定行之间切换

ruby-on-rails - 如何检查是否在网站上找到了图像?

重新创建网站时的 css div 放置