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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写将过滤输入的用户名的正则表达式相关的知识,希望对你有一定的参考价值。

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

  • 以数字或字母开头(不区分大小写)
  • 可以包括-但不能连续包含多个 例如u-s-e-rus-erus--er
  • 用户名也不能以-开头或以-结尾 例如-useruser-
  • 它还需要至少1个字符(字母或数字)和最多39个字符。

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

^[a-zA-Zd](?:[a-zA-Zd]|-(?=[a-zA-Zd])){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-Zd]+(?:-[a-zA-Zd]+)*$

查看regex demoRegulex graph

enter image description here

细节

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

您可以使用负向前看来实现连字符限制:

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

以上是关于编写将过滤输入的用户名的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

grep过滤数字的正则表达式,拿来即用!

SQL 查询的正则表达式给出了一个空的 MatchCollection

将用户输入用于 Python 的正则表达式是不是安全?

grep文本查看工具及正则表达式

251 正则表达式

正则表达式概述