编写正则表达式以过滤输入的用户名

时间:2019-04-08 17:35:56

标签: javascript regex

我想编写一个正则表达式,以过滤以下用户名:

  • 以数字或字母开头(不区分大小写)
  • 可以包含-,但不能连续包含多个

    示例 u-s-e-rus-erus--er

  • 用户名也不能以-开头或以-结束

    示例 -useruser-

  • 还必须至少包含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

2 个答案:

答案 0 :(得分:3)

您可以使用

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

请参见regex demoRegulex graph

enter image description here

详细信息

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

答案 1 :(得分:0)

您可以使用否定前瞻来实现连字符限制:

^(?!.*-(-|$)|-)[a-z\d-]{1,39}$