确保给定字符串至少包含以下每个类别中的一个字符的正则表达式是什么。
小写字符
大写字母
数字
象征
我知道各个集合的模式,即 [a-z]
、[A-Z]
、\d
和 _|[^\w]
(我猜对了,不是吗?)。
但是我如何组合它们以确保字符串以任何顺序包含所有这些?
如果您需要一个正则表达式,请尝试:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)
一个简短的解释:
(?=.*[a-z]) // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z]) // use positive look ahead to see if at least one upper case letter exists
(?=.*\d) // use positive look ahead to see if at least one digit exists
(?=.*\W) // use positive look ahead to see if at least one non-word character exists
我同意 SilentGhost,\W
可能有点宽泛。我会用这样的字符集替换它:[-+_!@#$%^&*.,?]
(当然可以随意添加更多!)
Bart Kiers,您的正则表达式有几个问题。最好的方法是:
(.*[a-z].*) // For lower cases
(.*[A-Z].*) // For upper cases
(.*\d.*) // For digits
(.*\W.*) // For symbols (non-word characters)
这样,无论是在开头、结尾还是中间,您都在搜索。在你有我有很多复杂密码的麻烦。
您可以分别匹配这三个组,并确保它们都存在。此外,[^\w]
似乎有点过于宽泛,但如果这是您想要的,您可能希望将其替换为 \W
。
\W
和 [\W]
结果相同。
Bart Kiers solution 很好,但它错过了拒绝具有 空格 的字符串和接受具有 下划线 (_
) 作为符号的字符串。
改进 Bart Kiers 解决方案,这里是正则表达式:
(?=.\d)(?=.[a-z])(?=.[A-Z])((?=.\W)|(?=.*_))^[^ ]+$
一个简短的解释:
(?=.*[a-z]) // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z]) // use positive look ahead to see if at least one upper case letter exists
(?=.*\d) // use positive look ahead to see if at least one digit exists
(?=.*\W) // use positive look ahead to see if at least one non-word character exists
(?=.*_) // use positive look ahead to see if at least one underscore exists
| // The Logical OR operator
^[^ ]+$ // Reject the strings having spaces in them.
旁注:您可以在正则表达式 here 上尝试测试用例。
.+
更改为.*
会发生什么?我想不出一个因.*
而失败的测试用例。在这种情况下它们是否相同? “零个或多个字符”似乎很好 - 只是寻求确认。.+
更改为.*
甚至.{4,}
都没有区别。(?=.*[_\W])
不起作用regex101.com/r/jH9rK1/1^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*[&%$]).{6,}$