这是,如果你想要一个优雅的正则表达式,尽可能接近
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&'])[^ ]{8,}$
基本思想是使用一种称为“积极前瞻”的技术:
(?=.*PutHereWhatYouWantToAllow)
使用正则表达式很难解决您的额外要求(四分之三),因为您基本上无法使它们计数。您可以写出上述正则表达式的必要排列(告诉我它是否没有意义),但这会使正则表达式很长。您可以做的是写出代码中的排列,以便正则表达式保持可维护性,因为您没有逐字重复这些模式。
如果我告诉我你的语言(C#?),我会试一试,因为这是一个很好的挑战。
更新 1
这是匹配至少 3 个要求(也允许 4 个)的正则表达式,只是为了应对它。不要在生产中使用它,而是在注释中提到的带有单个正则表达式的语言循环。
^((?=. [az]. [AZ]. [\d])|(?=. [az]. [\d]. [AZ])|(?=. [AZ]. [az]. [\d])|(?=. [AZ]. [\d]. [az])|(?=. [\d]. [az]. [AZ])|(?=. [\d] . [AZ]. [az])|(?=. [az]. [AZ]. [!@#$%^&'])|(?=. [az]. [!@#$%^& ']. [AZ])|(?=. [AZ]. [az]. [!@#$%^&'])|(?=. [AZ]. [!@#$%^&'] . [az])|(?=. [!@#$%^&']. [az]. [AZ])|(?=. [!@#$%^&']. [AZ]. [ az])|(?=. [az]. [\d]. [!@#$%^&'])|(?=.[阿兹]。[!@#$%^&']。[\d])|(?=. [\d]. [az]. [!@#$%^&'])|(?=. [\d]. [!@#$%^&'] . [az])|(?=. [!@#$%^&']. [az]. [\d])|(?=. [!@#$%^&']. [\d] . [az])|(?=. [AZ]. [\d]. [!@#$%^&'])|(?=. [AZ]. [!@#$%^&']. [\d])|(?=. [\d]. [AZ]. [!@#$%^&'])|(?=. [\d]. [!@#$%^&'] . [AZ])|(?=. [!@#$%^&']. [AZ]. [\d])|(?=. [!@#$%^&']. [\d] . [AZ]))[^]{8,}$
更新 2
这是采用java的方法
从我读到的评论中,您正在测试如下
- 小写 "^[az]*$";
- 大写 "^[AZ]*$";
- 数字="^[0-9]*$";
我不认为你在这里是在正确的轨道上。如果所有字符都是小写,而不仅仅是一个,小写只会报告成功。其余的也一样。
这些是 4 个单独的正则表达式,其中至少 3 个应该报告匹配
[a-z]
[A-Z]
\d
[!@#$%^&']
这是密码不应该包含空格的测试
^[^ ]*$
至少 8 个字符的测试
.{8,}
所以我拆分需求而不是合并它们。这应该使代码更具可读性,特别是如果以正则表达式开头。