RegEx以确保字符串至少包含一个小写字符、大写字符、数字和符号

正则表达式是什么,以确保给定的字符串包含至少一个来自以下每个类别的字符。

  • 小写字母开头
  • 大写字符
  • 数字
  • 象征

我知道单个集合的模式,即[a-z][A-Z]\d_|[^\w](我得到了他们的正确,不是吗?)

但是我如何将它们组合起来以确保字符串以任意顺序包含所有这些呢?

252837 次浏览

你可以分别匹配这三组,并确保他们都出现了。而且,[^\w]似乎有点太宽泛了,但如果这是你想要的,你可能想要用\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可能有点宽泛。我会用像这样的字符集替换它:[-+_!@#$%^&*.,?](当然可以随意添加更多!)

巴特·基尔斯,你的正则表达式有点问题。最好的方法是:

(.*[a-z].*)       // For lower cases
(.*[A-Z].*)       // For upper cases
(.*\d.*)          // For digits
(.*\W.*)          // For symbols (non-word characters)

这样,无论你是在开头、结尾还是在中间,你都在搜索。在你的世界里,我对复杂的密码有很多困扰。

巴特基尔解法很好,但它会拒绝具有空间的字符串,并接受具有下划线 (_)作为符号的字符串。

改进巴特基尔的解决方案,下面是正则表达式:

(?=.*\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.

旁注:您可以在正则表达式在这里上尝试测试用例。