【问题标题】:validate username with regex in javascript在 javascript 中使用正则表达式验证用户名
【发布时间】:2020-07-02 15:33:05
【问题描述】:

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

  1. 用户名的长度必须在 4 到 20 个字符之间
  2. 用户名只能包含字母 a-z、数字 0-9 和特殊字符 -._
  3. 特殊字符 -._ 不得连续使用,以免混淆
  4. 用户名不得包含空格

示例

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

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

[a-z0-9.-_]{4,20}

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

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

提前致谢:)

【问题讨论】:

  • 最简单的方法是提供一个您逐一测试的规则列表。通过使用这种方法,您可以让用户知道他违反了哪些规则。
  • 好吧,我选择了一种向用户显示消息的方法,该消息指定用户名无效的原因可能是什么。使用 ifs 进行此类检查很乏味...
  • 严肃的问题:你为什么要对用户名施加所有这些限制?除了可能是最大长度(因为 varchar 也不应该特别重要),您对所有这些限制有什么真正的原因? (例如,您用于显示用户名的代码不应该关心。它可能会切断用户名,但您应该在人们注册时简单地告诉他们。“选择长用户名意味着人们不会看到整个事情”)
  • @Mike'Pomax'Kamermans 因为这样做很常见。例如,根据使用的字体,用户无法识别 my__username 有两个下划线。此外,这些规则会阻止用户创建像 _________name____ 这样的用户名
  • “其他人这样做”并不是真正的原因。大量的网站都这样做,作为用户,这很痛苦=)如果有人想要用户名__,那么只要你的前端清楚什么是用户名,什么不是,那没有什么问题用户名,记住这一点很重要。想要限制它是好的,但是很多“常见做法”都是基于几十年前的技术限制,如果你正在编写新的东西,实际上这些都不适用。

标签: javascript regex


【解决方案1】:

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

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

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

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

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

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

这里没有什么真正神秘的东西,除了[-._](?![-._]) 组,这意味着-._ 的任何一个后面都没有-._ 的任何一个。

【讨论】:

  • 非常感谢这个答案:) 我几乎猜到我应该使用负前瞻,但不知道如何实现它?
  • 过去 2 小时我一直在寻找,您节省了我的时间。 - 非常感谢好友@GOTO 0