理想的用户名和密码REGEX验证

时间:2017-09-27 16:53:19

标签: regex

我正在编写登录表单,我想使用正则表达式来验证用户输入,如下所示:

用户名:

  • 长度为5到16个字符
  • 可以使用大写和小写字母数字字符
  • 可以使用下划线,短划线和空格,但不能连续使用两个,也不能用它开始或启动用户名。 这是我正在使用但最大长度限制不起作用
([a-zA-Z0-9]+([_ -]?[a-zA-Z0-9])*){5,16}

密码:

  • 长度为8到16个字符
  • 至少有一个特殊字符“!”#$%&'()* +, - 。/:;< =>?@ [] ^ _` {|}〜“
  • 至少一个号码
  • 至少一个大写字符
  • 至少一个小写字符

这是我到目前为止所做的,但它无法正常工作

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[" !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"]).{8,16}

感谢您对此的帮助

编辑

我使用html输入元素的pattern标签和regex验证客户端的用户输入,并使用PHP来验证服务器端的输入。

我正在设计登录/升级系统,如果您认为我应该对用户名和密码实施不同的限制,请告诉我

再次感谢

1 个答案:

答案 0 :(得分:4)

由于我不知道您使用的是哪种编程语言,因此我会向您展示PCRE风格的正则表达式。这允许使用负面的外观,这将在用户名验证中看到。

此外,您不应将密码长度限制为16。

代码

用户名

See this code in use here

^(?![_ -])(?:(?![_ -]{2})[\w -]){5,16}(?<![_ -])$

密码

See this code in use here

^(?:(?=.*?\p{N})(?=.*?[\p{S}\p{P} ])(?=.*?\p{Lu})(?=.*?\p{Ll}))[^\p{C}]{8,16}$

结果

输入 - 用户名

** VALID **
usern
username-is-writ
username is here
username_is_here


** INVALID **
user
username-is-written-here
-username
_username
 username
username-
username_
username 
username--here
username  here
username__here
username- here
username _here

注意:上面的第8个无效输入有一个尾随空格

输出 - 用户名

usern
username-is-writ
username is here
username_is_here

输入 - 密码

********** VALID **********
Password1!
TestPass###231
My Pass#123~12`1
!#$Afs1!@(*''
VDFt35q#@$@
éA1!@#!@#!

********* INVALID *********
PASSWORD1!
password1!
Password1
Password
Passw1!
ThisIsMySuperLongPassword1!
Ae!                     1

注意:上面的最后一个无效示例使用标签(无效字符)

输出 - 密码

Password1!
TestPass###231
My Pass#123~12`1
!#$Afs1!@(*''
VDFt35q#@$@
éA1!@#!@#!

说明

用户名

  • ^在行首处断言位置。
  • (?![_ -]否定前瞻以确保用户名不以集_ -
  • 中的字符开头
  • (?:(?![_ -]{2})[\w -]){5,16}
    • 匹配5到16个字符,符合以下格式。
      • (?![_ -]{2})否定前瞻以确保集_ -中没有两个字符紧跟在一起。
      • [\w -]匹配任何字词(a-zA-Z0-9_)或空格或-
  • (?<![_ -]负面反馈,以确保用户名不会以集_ -
  • 中的字符结尾
  • $在行尾断言位置。

密码

  • ^在行开头处断言位置
  • (?:(?=.*?\p{N})(?=.*?[\p{S}\p{P} ])(?=.*?\p{Lu})(?=.*?\p{Ll}))将正向前瞻分组以便于查看,如果愿意,可以删除非捕获组。随后的每个正向前瞻使用.*?。这将任意次数匹配任何字符,但尽可能少。
    • (?=.*?\p{N})确定至少存在一个数字字符的正面预测。
    • (?=.*?[\p{S}\p{P} ]确定至少使用一个符号,标点符号或空格的正面预测。
    • (?=.*?\p{Lu})确保至少使用一个大写字母的正面预测。
    • (?=.*?\p{Ll})确保至少使用一个小写字母的正面预测。
  • [^\p{C}]{8,16}匹配任何非控制字符8到16次。
  • $在行尾断言位置。