无效的正则表达式 - 仅限Google Chrome

时间:2016-02-16 23:28:26

标签: javascript regex google-chrome

我有这个正则表达式来验证用户名:

/^(?=.{5,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$/

适用于IE,Firefox和Safari浏览器,但在Chrome中,调用验证时会出现javascript错误。

  

Uncaught SyntaxError:无效的正则表达式:/ ^(?=。{5,20} $)(?![。])(?!。* [。] {2})[ a-zA-Z0-9。] +(?。])$ /:组无效

我使用了Expresso和regex101.com来确认它是一个语法正确的正则表达式。

我如何找到问题?

3 个答案:

答案 0 :(得分:3)

lookbehind (?<![_.])会检查最后一个字符是_还是.。你可以通过前瞻来做到这一点:

/^(?!.*[_.]$)(?=.{5,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+$/
  ^^^^^^^^^^^ 

或者,您可以使用分组,以便._始终使用字母数字并缩短您的正则表达式:

/^(?=.{5,20}$)[a-zA-Z0-9]+(?:[._][a-zA-Z0-9]+)*$/

BTW,您可以使用JS 字符串长度检查长度,并保留/^[a-zA-Z0-9]+(?:[._][a-zA-Z0-9]+)*$/正则表达式。更具可读性和可维护性。

var pass = "Someword234";
if (/^[a-zA-Z0-9]+(?:[._][a-zA-Z0-9]+)*$/.test(pass) && pass.length > 5 && pass.length < 20) {
    document.write("Good!");
} else {
  document.write("Bad!");
}

答案 1 :(得分:2)

阅读你的模式似乎你需要一个字符串:

  • 仅包含ascii字母,数字,点和下划线
  • 不以点或下划线开头或结尾
  • 没有连续的点或下划线
  • ,长度在5到20个字符之间

在一种模式中,你可以这样写:

/^(?=.{5,20}$)[A-Z0-9]+(?:[_.][A-Z0-9]+)*$/i

答案 2 :(得分:1)

看起来它在javascript中不受支持

(?<!....)

现在尝试

/^(?=.{5,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?![_.])$/