gpt4 book ai didi

正则表达式查找 4 个条件中的 3 个

转载 作者:太空宇宙 更新时间:2023-11-03 20:01:06 24 4
gpt4 key购买 nike

我的客户要求他们系统上的密码必须遵循一组特定的验证规则,而我很难想出一个“好的”正则表达式。

我得到的规则是......

  • 至少 8 个字符
  • 允许任何字符
  • 必须至少有一个来自以下四种字符类型中的三种的实例...
    1. 大写字符
    2. 小写字符
    3. 数字
    4. “特殊角色”

当我按下更多键时,“特殊字符”实际上就是其他所有内容(包括空格)。

我可以使用以下命令轻松检查所有四个实例中的至少一个实例...

^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d)(?=.*?[^a-zA-Z0-9]).{8,}$

以下内容有效,但它很糟糕而且很困惑......

^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d)|(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[^a-zA-Z0-9])|(?=.*?[A-Z])(?=.*?\d)(?=.*?[^a-zA-Z0-9])|(?=.*?[a-z])(?=.*?\d)(?=.*?[^a-zA-Z0-9])).{8,}$

所以你不用自己算了,上面是检查(1,2,3|1,2,4|1,3,4|2,3,4)这是 4 组的 4 种可能组合(其中数字与规则集中的“类型”相关)。

是否有“更好”、更干净或更简单的方法来做到这一点?

(请注意,这将在 ASP.NET 网站的 <asp:RegularExpressionValidator> 控件中使用,因此需要是 .NET 和 javascript 的有效正则表达式。)

最佳答案

这并不是一个更好的解决方案,但您可以将 [^a-zA-Z0-9] 减少为 [\W_],因为单词字符是所有字母、数字和下划线字符。我认为在尝试在单个正则表达式中执行此操作时,您无法避免交替。我认为你已经有了最好的解决方案。

一个轻微的优化是 \d*[a-z]\w_*|\d*[A-Z]\w_* ~> \d*[a-zA-Z]\w_*,这样我就可以删除其中一个交替集。如果您只允许 4 中的 3 个,则这将不起作用,但由于 \d*[A-Z][a-z]\w_* 被隐式允许,因此它可以工作。

(?=.{8,})((?=.*\d)(?=.*[a-z])(?=.*[A-Z])|(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])).*

扩展版本:

(?=.{8,})(
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])|
(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])|
(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])
).*

由于OP指定的第四个条件,这个正则表达式甚至会匹配不可打印的字符,例如换行符。如果这是 Not Acceptable ,则修改包含 \W 的集合以允许更具体的特殊字符集。

关于正则表达式查找 4 个条件中的 3 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com