首页 > 解决方案 > 编写将过滤输入的用户名的正则表达式

问题描述

我想编写一个正则表达式来过滤任何用户名:

我最接近我的结果是这样的:

^[a-zA-Z\d](?:[a-zA-Z\d]|-(?=[a-zA-Z\d])){0,38}

这完全匹配它应该匹配的东西,但它也匹配一些它不应该匹配的东西。

基本上这些不应该是有效的:

-username
_username_
__us_ername
us_er
username-
1user--name
132uname-
-uname1234
-username-
user--name
av34axc-
1234567890A1234567890B1234567890C1234567890D

这些应该是有效的:

Username
a-a
aBc
BaC
1-1
1-2-3-4
q-1-2-3
q-q-q-q-q
username
123username123
username3123
1234
user-name
13-13
q1-q2-q3
a
A
1234567890A1234567890B1234567890C123456
1234567890A123456-7890B1234567890C12345

标签: javascriptregex

解决方案


您可以使用

^(?=.{1,39}$)[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*$

请参阅正则表达式演示Reglex 图

在此处输入图像描述

细节

  • ^- 字符串的开始
  • (?=.{1,39}$)- 长度必须为 1 到 39 个字符
  • [a-zA-Z\d]+- 1+ 字母数字字符
  • (?:-[a-zA-Z\d]+)*- 0次或多次重复
    • -- 一个连字符
    • [a-zA-Z\d]+- 1+ 字母数字字符
  • $- 字符串结束。

推荐阅读