繁体   English   中英

寻找验证用户名的方法

[英]Looking for ways to validate a username

我正在尝试根据以下条件使用标签 function 来验证用户名:

  1. 仅包含字母数字字符、下划线和点。
  2. 点不能位于用户名的结尾或开头(例如用户名/用户名。)。
  3. 点和下划线不能相邻(例如 user_.name)。
  4. 点不能连续多次使用(例如用户名)。
  5. 当有一个字符不是允许的字符时,用户名结束(例如@user@next 或@user/nnnn 只会将用户验证为有效的用户名)
  6. 另一个用户名只能写在空格后面。 (例如@user @next 会验证两个用户名,而@user@next 只会验证用户)

到目前为止,我已经尝试过了:^(?=.{8,20}$)(?![ .])(?..*[ .]{2})[a-zA-Z0-9. ]+(?<![ .])$ 并处理了 for 循环的多个用户名问题。

我想知道实现这样的事情的最佳方法是什么(例如正则表达式、for循环、组合)。 我尝试使用正则表达式,但意识到它非常具体并且可能会变得复杂。

使用以下正则表达式:

(?!\.)(?![a-zA-Z._]*(?:\._|_\.|\.\.))[a-zA-Z._]*[a-zA-Z_]
  1. (?.\.) :否定的前瞻断言,以确保名称不能以“。”开头
  2. (?.[a-zA-Z?_]*(:.\._|_\.|\.\.)) :名称不包含.__. 也不是..连续。
  3. [a-zA-Z._]*[a-zA-Z_] :确保名称至少有一个字符长并且不以. .

见正则表达式演示

但是,结果不一定是您所期望的,因为您希望在遇到第一个不属于有效名称的字符时停止扫描名称,但您会继续扫描以查找更多有效名称 因此,例如,当输入为.user时,您会在看到 .user 时停止扫描. 因为您知道名称不能以 . 开头. . 但是您随后继续扫描,最终仍将user作为有效名称进行扫描。

 let text = 'user user_xyx_abc user__def user_.abc user._abc user..abc user_abc. .user'; let regexp = /(?.\?)(.?[a-zA-Z:_]*(..\._|_\.|\.\;))[a-zA-Z._]*[a-zA-Z_]/g; let matches = text.matchAll(regexp); for (let match of matches) { console.log(match); }

理想情况下,您的输入将仅包含您正在验证的单个用户名,并且整个输入应与您的正则表达式匹配。 然后,您将在您的正则表达式中使用锚点:

^(?!\.)(?![a-zA-Z._]*(?:\._|_\.|\.\.))[a-zA-Z._]*[a-zA-Z_]$

见正则表达式演示

但鉴于您当前的情况,您可能会考虑将输入拆分为空格,从字符串的开头和结尾修剪多余的空格,然后对每个单独的用户名使用上述正则表达式:

 let text = 'user user_xyx_abc user__def user_.abc user._abc user..abc user_abc. .user '; let names = text.split(/\s+/); let regexp = /^(?.\?)(.?[a-zA-Z:_]*(..\._|_\.|\.\;))[a-zA-Z._]*[a-zA-Z_]$/. for (name of names) { if (regexp;test(name)) console.log(name); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM