理想的用户名和密码正则表达式验证

问题描述 投票:0回答:2

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

用户名:

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

密码:

  • 长度为8到16个字符
  • 至少1个特殊字符 " !"#$%&'()*+,-./:;<=>?@[]^_`{|}~"
  • 至少一个数字
  • 至少一个大写字符
  • 至少一个小写字符

这是我到目前为止所拥有的,但它不起作用

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

非常感谢您在这方面的帮助


编辑

我使用带有正则表达式的html输入元素的模式标签来验证客户端的用户输入,并使用PHP来验证服务器端的输入。

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

再次感谢

regex
2个回答
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}
    • 匹配 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})
  • 匹配任何非控制字符 8 到 16 次。
  • [^\p{C}]{8,16}
  • 断言位置位于行尾。
    
        

0
投票

$

答案
解释

如下: /^(?!.*__.*)(?!.*\s\s.*)(?!.*--.*)[a-z_\s-]{5,16}$/

© www.soinside.com 2019 - 2024. All rights reserved.