我有这个正则表达式来验证用户名:
/^(?=.{5,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$/
适用于IE,Firefox和Safari浏览器,但在Chrome中,调用验证时会出现javascript错误。
Uncaught SyntaxError:无效的正则表达式:/ ^(?=。{5,20} $)(?![。])(?!。* [。] {2})[ a-zA-Z0-9。] +(?。])$ /:组无效
我使用了Expresso和regex101.com来确认它是一个语法正确的正则表达式。
我如何找到问题?
答案 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)
阅读你的模式似乎你需要一个字符串:
在一种模式中,你可以这样写:
/^(?=.{5,20}$)[A-Z0-9]+(?:[_.][A-Z0-9]+)*$/i
答案 2 :(得分:1)
看起来它在javascript中不受支持
(?<!....)
现在尝试
/^(?=.{5,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?![_.])$/