我正在编写登录表单,我想使用正则表达式来验证用户输入,如下所示:
用户名:
([a-zA-Z0-9]+([_ -]?[a-zA-Z0-9])*){5,16}
密码:
这是我到目前为止所做的,但它无法正常工作
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[" !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"]).{8,16}
感谢您对此的帮助
我使用html输入元素的pattern标签和regex验证客户端的用户输入,并使用PHP来验证服务器端的输入。
我正在设计登录/升级系统,如果您认为我应该对用户名和密码实施不同的限制,请告诉我
再次感谢
答案 0 :(得分:4)
由于我不知道您使用的是哪种编程语言,因此我会向您展示PCRE风格的正则表达式。这允许使用负面的外观,这将在用户名验证中看到。
此外,您不应将密码长度限制为16。
^(?![_ -])(?:(?![_ -]{2})[\w -]){5,16}(?<![_ -])$
^(?:(?=.*?\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}
(?![_ -]{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次。$
在行尾断言位置。