繁体   English   中英

如何构造用于用户名验证的正则表达式?

[英]How to construct a regex expression for username validation?

我正在为具有以下约束的用户名验证构造PHP regex表达式:

-长度必须为10-16个字符,并且由字母,数字和至少一个特殊字符(*&^ -_ $$)组成-不能以数字或特殊字符开头

更正:最后的MMYYYY format数字必须是一个月/日期生日( MMYYYY format )。 为了进一步验证用户名,月份/日期必须显示用户名超过18-如果不是,则用户名将不验证。 预先感谢您的协助! 我已经坚持了一段时间。

您可以使用以下正则表达式执行此操作:

/(?=^.{10,16}$)(?=.+?[*&^_$-])[a-z].+?[01]\d{3}$/i

这是一个带有一些单元测试的演示。

说明

  • /分隔符
  • (?=^.{10,16}$)确保有10-16个字符,从头到尾
    • (?=启动前瞻组
    • ^字符串的开头
    • .{10,16}十到十六个字符
    • $字符串结尾
    • )结束超前组
  • (?=.+?[*&^_$-])确保集合*&^_$-中至少有一个特殊字符,并且不是第一个
    • (?=启动前瞻组
    • .+? 一个或多个字符,非贪婪
    • [*&^_$-]集合*&^_$-中的任何字符(请注意顺序;您必须将-放在首位或最后一位,或将其转义为\\-
    • )结束超前组
  • [az]以字母开头
  • .+? 以非贪婪的方式匹配任何字符,并根据需要返回
  • [01]\\d{3}匹配01然后再匹配3个数字
  • $匹配字符串的结尾
  • /结束定界符
  • i使比赛不区分大小写

正则表达式构建的一些注意事项

请注意,有多种有效的方法可以执行此操作。 为了提高效率,可以稍微简化上述解决方案,以减少处理器的几个步骤。

但是出于可读性考虑,我喜欢上面的内容。 很清楚每个块,字符集或组的作用,这使其可读性和可维护性。

/^[az](?=.*?[*&^_$-])[a-z0-9*&^_$-]{5,11}[01]\\d{3}$是难以阅读和理解。 如果要允许使用17个字符的用户名怎么办? 您必须进行一堆数学运算才能确定应将{5,11}更改为{5,12} 或者,如果您决定允许字符# ,则必须在两个位置添加它(顺便说一句,这意味着正则表达式已经违反了DRY原理 )。

奖励:为什么您的尝试失败

您在评论中说,您尝试过此操作:

(?=^.{10,16}$)^[a-z][\d]*[_$^&*]?[a-z0-9]+

第一部分(?=^.{10,16}$)很好。 ^[az]

但是[\\d]* 匹配零个或多个数字; 它与字母或特殊字符不匹配。 因此,例如, a&a...将失败。

还有[_$^&*]? 只匹配零个或一个特殊字符。 它将允许不带特殊字符的用户名通过,但会失败但不带​​2个特殊字符的用户名。

[a-z0-9]+仅匹配那些字符,并且您省略了最后四个字符必须为数字的要求。

您可能会在regex101.com上找到有关regex的说明很有帮助。 (注意:我与该网站没有任何隶属关系。)

您可以使用此正则表达式:

^[a-zA-Z](?=.*[*&^_$-])[\w*&^$-]{5,11}[01]\d{3}$

正则表达式分手:

^                  # Line start
[a-zA-Z]           # # match an alhpabet
(?=.*[*&^_$-])     # lookahead to ensure there is at least one special char
[\w*&^$-]{5,11}    # match 5 to 11 of allowed chars
[01]\d{3}          # match digits 0/1 followed by 3 digits
$                  # Line end

我使用了量词{5,11}因为一个字符在开始时是匹配项,而在结尾处是4个字符,因此从所需的{10,16}长度中取出5个位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM