在 javascript 中使用正则表达式验证用户名

lin*_*ram 1 javascript regex

我是正则表达式的新手,想创建一个正则表达式来检查用户名。这些是条件:

  1. 用户名必须包含 4 到 20 个字符
  2. 用户名不能包含除字母 az、数字 0-9 和特殊字符 -._ 之外的任何内容
  3. 特殊字符 -._ 不得连续使用以避免混淆
  4. 用户名不得包含空格

例子

  • 任何.user.13 => 有效
  • any..user13 => 无效(连续两个点)
  • 任何用户=> 有效
  • 任何=> 无效(太短)
  • anyuserthathasasupersuperlonglongname => 无效(字符太多)
  • 任何用户名=> 由于空格而无效

我尝试创建自己的正则表达式,但只指定了允许的字符:

[a-z0-9.-_]{4,20}
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果中间有空格,它仍然匹配字符串,并且可能连续有两个特殊字符 .-_ :

尽管连续匹配空格和两个点

如果有人能够在这个问题上为我提供帮助,我将不胜感激。请记住,我是正则表达式的新手,仍在学习中。因此,对你的正则表达式的解释会很棒。

提前致谢 :)

GOT*_*O 0 6

有时编写正则表达式几乎与查找用户名一样具有挑战性。但在这里你已经非常接近成功了。我可以指出你的尝试失败的三个原因。

首先,我们需要匹配所有输入字符串,而不仅仅是其中的一部分,因为我们不想忽略输入中出现的空格和其他字符。为此,通常会分别使用锚点^(比赛开始)和$(比赛结束)。

还有一点是我们需要防止两个特殊字符相邻出现。最好通过负前瞻来完成此操作。

最后,我可以看到您用来测试正则表达式的工具正在添加 flags gmi,这不是我们想要的。特别是,该i标志表示正则表达式应该不区分大小写,因此它应该像小写字母一样匹配大写字母。删除该标志。

最终的正则表达式如下所示:

/^([a-z0-9]|[-._](?![-._])){4,20}$/

这里没有什么真正神秘的,除了组[-._](?![-._]),这意味着任何一个-._不跟随任何一个-._