我想写一个正则表达式来过滤任何用户名:
- 以数字或字母开头(不区分大小写)
可以包含
-
但不能连续包含多个示例
u-s-e-r
✔us-er
✔us--er
✖用户名不能以
-
开头或以-
结尾示例
-user
✖user-
✖- 还需要至少 1 个字符(字母或数字),最多 39 个字符。
我最接近的结果是这样的:
^[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
最佳答案
你可以使用
^(?=.{1,39}$)[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*$
参见 regex demo和 Regulex graph :
详情
^
- 字符串的开始(?=.{1,39}$)
- 长度必须是 1 到 39 个字符[a-zA-Z\d]+
- 1+ 个字母数字字符(?:-[a-zA-Z\d]+)*
- 0 次或多次重复-
- 连字符[a-zA-Z\d]+
- 1+ 个字母数字字符
$
- 字符串结尾。
关于javascript - 编写将过滤输入的用户名的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55578852/