正则表达式 - 至少包含1个数字、1个字母、1个特殊字符且至少3个字符。

6

我想测试自己的正则表达式,以便了解如何使用它并创建自定义的正则表达式。

我尝试了这个:

^(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_]){3}$

(?=.*\d) => 至少需要1个数字。 (?=.*[a-zA-Z]) => 至少需要1个字母。 (?=.*[\W_])=> 至少需要1个特殊字符。 {3} => 至少需要3个字符。

很遗憾,这段代码不起作用。我需要至少1个数字,1个字母和1个特殊字符,并且输入至少需要3个字符。当用户输入这三种类型的字符时,我的消息会消失,因为正则表达式是正确的^^

对不起我的英语不好,如果您需要更多细节,我可以提供给您。谢谢您的帮助 :)

祝您愉快 :)

2个回答

5
问题在于您的{3}量词应用于最后一个先行断言,这是没有意义的:这意味着在文本开头,您必须匹配3次先行断言,如果它匹配一次,则必须满足这个条件,因为先行断言是0宽度匹配。
您可以使用以下内容:
^(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_]).{3,}$

除了现有的前瞻匹配,该指令还要求至少匹配3个字符。

如果您只是测试字符串,则匹配也足够。

^(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_]).{3}

没有结束锚点: 你匹配了3个字符,并且停止匹配后面的内容,因为你的要求已经满足。


4
如果你想要1个数字、1个字母和1个特殊字符,那就至少需要3个字符。
^(?=\D*\d)(?=.*?[a-zA-Z]).*[\W_].*$

这是一个在regex101上的演示链接:https://regex101.com/r/bY1cM1/1。或者仅用于匹配:
^(?=\D*\d)(?=.*?[a-zA-Z]).*[\W_]
  • (?=\D*\d) 第一个前瞻需要一个数字(在任何非数字 \D 之前)。
  • (?=.*?[a-zA-Z]) 第二个前瞻需要一个字母(在任何字符之前)。
  • .*[\W_] 匹配直到一个特殊字符。

所有条件结合起来需要至少3种不同的字符:1个数字、1个字母、1个特殊字符。


有趣的做法,比我的答案更有效,但我宁愿让初学者开发人员维护我的答案而不是你的 :) 如果你能解释一下如何通过匹配前瞻来保证一定数量的字符,那就太好了! - Aaron
1
@Aaron 添加了更多的解释。 - bobble bubble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接