正则表达式编号或符号

时间:2019-02-06 16:08:33

标签: regex

我正在尝试创建一个满足以下密码要求的正则表达式。

  1. 必须至少包含1个大写字母
  2. 必须至少有1个小写字母
  3. 必须包含数字或符号-失败
  4. 长度必须在8到16个字符之间

    ^(?=.*\d|[!@#\$%\^&])(?=.*[a-z])(?=.*[A-Z]).{8,16}$

除OR部分外,几乎可以正常运行。 它会验证Tester01和Tester0%,但不会验证Tester%$或带有两个符号的任何东西,以防万一用户没有输入数字。我还尝试将\ d放在方括号内,以为我不得不将数字和符号分开,但这没用。

2 个答案:

答案 0 :(得分:0)

您的交替条件不正确。相反,您只需在特殊字符括号内滑动\d并将正则表达式更改为此,

^(?=.*[\d!@#\$%\^&])(?=.*[a-z])(?=.*[A-Z]).{8,16}$

现在,您(?=.*[\d!@#\$%\^&])的表现将完全符合您的期望。它将确保一个字符是任何数字或字符类中提到的其他特殊字符。

Demo

您的(?=.*\d|[!@#\$%\^&])前瞻失败的原因是,您的第一个交替条件是.*\d,第二个只是[!@#\$%\^&],似乎正确书写的应该是这个,或者

(?=.*\d|.*[!@#\$%\^&])

OR

(?=.*(\d|[!@#\$%\^&]))

如果真的像我上面写的那样书写,您根本不需要任何替代,您只需将\d放在字符集本身中,就像这样,

(?=.*([\d!@#\$%\^&]))

答案 1 :(得分:0)

使用对比原则,多次超前。

^
(?=[^A-Z]*[A-Z])
(?=[^a-z]*[a-z])
(?=[^\d!@#\$%\^&]*[^\d!@#\$%\^&])
.{8,16}
$

但是here(为什么密码验证不正确?),请参阅please read this post as well