【问题标题】:Greedy regex quantifier not matching password criteria贪婪的正则表达式量词与密码条件不匹配
【发布时间】:2019-04-22 22:18:52
【问题描述】:
/(^[a-zA-Z]+-?[a-zA-Z0-9]+){5,15}$/g
正则表达式标准
匹配长度必须介于 6 到 16 个字符之间(含)
只能以字母开头
必须包含字母、数字和一个可选连字符
不能以连字符结尾
上述正则表达式不满足所有 4 个条件。尝试将^ 移到组之前并省略+ 量词但不起作用
【问题讨论】:
标签:
regex
testing
passwords
【解决方案1】:
您正在对已经具有量化子模式的组设置限制量词,因此长度限制将不起作用。
要设置长度限制,请在^ 之后添加(?=.{6,16}$) 前瞻,然后随意设置您的消费模式。
你可以使用
/^(?=.{6,16}$)[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)?$/
请参阅regex demo。请注意,在针对正则表达式验证整个输入字符串时,不应使用 g 修饰符。
详情
-
^ - 字符串开头
-
(?=.{6,16}$) - 允许/需要在字符串输入中包含 6 到 16 个字符
-
[a-zA-Z] - 一个字母作为第一个字符
-
[a-zA-Z0-9]* - 0+ 个字母数字字符
-
(?:-[a-zA-Z0-9]+)? - - 的可选序列,然后是 1+ 字母数字字符
-
$ - 字符串结束。
【解决方案2】:
你需要的一切
^(?i)(?=.{6,16}$)(?!.*-.*-)[a-z][a-z\d-]*\d[a-z\d-]*(?<!-)$
可读
^
(?i)
(?= .{6,16} $ ) # 6 - 16 chars
(?! .* - .* - ) # Not 2 dashes
[a-z] # Start letter
[a-z\d-]* # Optional letters, digits, dashes
\d # Must be digit
[a-z\d-]* # Optional letters, digits, dashes
(?<! - ) # Not end in dash
$
好吧,至少我的正则表达式强制存在一个数字。