正则表达式,以确保该字符串包含至少一个小写字符,大写字符,数字和符号


156

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

  • 小写字符
  • 大写字母
  • 数字
  • 符号

我知道各个集合的模式分别[a-z][A-Z]\d_|[^\w](我把它们弄对了,不是吗?)。

但是,如何组合它们以确保字符串以任何顺序包含所有这些?


什么平台/正则表达式?Bart的答案是正确的,但是例如,前瞻性断言在JavaScript中并不可靠。
bobince

没什么特别的-我正在学习正则表达式。有没有可以在javascript中使用的替代方法?
Amarghosh,2009年

@bobince嘿,我试图找出为什么提前声明在Javascript中不可靠。是否有关于此的文章?
克里斯·比尔

@ChrisB:确实有一个令人困惑的IE / JScript错误:blog.stevenlevithan.com/archives/regex-lookahead-bug
bobince

Answers:


349

如果您需要一个正则表达式,请尝试:

(?=.*\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可能有点宽泛。我将其替换为这样的字符集:([-+_!@#$%^&*.,?]当然可以随意添加更多!)


如果我改变最后会发生什么.+.*?我无法提出一个失败的测试用例.*。在这种情况下,它们是否相同?“零个或多个字符”似乎很好-只是寻求确认。
2009年

@Amarghosh:在这种情况下,没有区别。由于积极的前瞻性,该字符串已经包含至少4个字符。因此,.+改成.*甚至.{4,}就此而言都没有区别。
巴特·基尔斯

如果您愿意添加一些解释,那么我很难理解这些先行组合如何确保每个字符集中至少有一个出现
Sharlike

@Sharlike,我不知道如何改写以使其更易于理解。尤其是在这些小的注释框中。我建议您阅读以下内容:regular-expressions.info/lookaround.html,如果仍然有问题,只需发表自己的问题。祝好运!
巴特·基尔斯

4
@ikertxu,尝试类似的方法:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*[&%$]).{6,}$
Bart

20

Bart Kiers,您的正则表达式有几个问题。最好的方法是:

(.*[a-z].*)       // For lower cases
(.*[A-Z].*)       // For upper cases
(.*\d.*)          // For digits

这样,无论您是在开头,结尾还是中间进行搜索。您的复杂密码给我带来了很多麻烦。


5
您没有按照OP的要求检查符号。
卡西米尔,

5

您可以分别匹配这三个组,并确保它们都存在。另外,[^\w]似乎有点太宽泛了,但是如果您要这样做,则可能要替换为\W


谢谢。我不知道\ W。只是查找它,发现它与Not Word匹配。\ W和[\ W]有什么区别?[\ W]只是多余的吗?
Amarghosh,2009年

@Amarghosh,是的,\W并且[\W]结果是相同的。
巴特·基尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.