【发布时间】:2015-09-06 08:23:03
【问题描述】:
此正则表达式适用于 < input type="password" ... /> 内的 HTML5 pattern="...",应为:
- 不少于 8 个字符,不多于 32 个。
- 必须至少包含 3 个字母。
- 必须至少包含 3 个数字。
- 必须包含除双引号外的任何其他 ASCII 字符(单引号也可以)。
这是我想出来的:
^.*(?=.{8,32})(?=.*[a-zA-Z]{3,})(?=.*\d{3,})(? =.*[^\x22]+).*$
但这里有问题:
- 密码中仍允许使用双引号!
- 此表达式仅在有三个连续数字或字母时才匹配,而不是在它们与其他字符穿插时匹配。
我花了一整天的时间阅读尽可能多的文档:O'Reilly 的文档、在线文档等,如果我无法弄清楚这一点,我就要绞尽脑汁了。
任何帮助都将不胜感激,您将节省一颗子弹和一颗大脑。
【问题讨论】:
-
有时间阅读文档,也有时间尝试自己。您正在寻找的模式并不复杂。我建议您花时间准确理解您的实际模式的含义(特别是前瞻的工作原理以及它们在特定位置是零宽度断言的事实)并进行实验。 (链接:regex101.com)。也看看其他密码/正则表达式问题。祝你好运。
-
试试
^(?=(?:[^a-zA-Z]*[a-zA-Z]){3})(?=(?:\D*\d){3})[^\x22]{8,32}$ -
谢谢,@stribizhev!这与 anubhava 的示例非常相似,但包括转义双引号所需的 \x22。 -- 已编辑: -- (?:[^a-zA-Z]*[a-zA-Z]) 和 (?:.*?[a-zA-Z]) 有什么区别?跨度>
-
复杂的密码规则通常不会带来更安全的密码,重要的只是最小长度。人们无法记住大量的强密码,这样的规则会干扰好的密码方案。人们可以非常有创意地绕过这些规则,例如通过使用弱密码,如
Password-2015。通常,您最终会得到较弱的密码,而不是较强的密码。
标签: regex html validation input passwords