【问题标题】:Regex for custom password requirements [duplicate]自定义密码要求的正则表达式 [重复]
【发布时间】:2020-05-18 22:27:38
【问题描述】:

我试图根据密码要求创建一个正则表达式。要求是

  • 最少八 (8) 个字符
  • 至少一个数字 (0-9)
  • 以下任意三个:
    • 小写
    • 大写
    • 号码
  • 特殊字符 (!" # $ % & ' ( ) * + , - . / : ; ?@ [ \ ] ^ _ ` { | } ~ )

我创建了这个正则表达式

/^[0-9a-zA-Z\s!"#$\%&'\(\)\*\+\,\-\.\/\:;<=>?@\[\\\]\^\_\`\{\|\}\~]+$/g

我对正则表达式了解不多,所以只需要确认它是正确的正则表达式还是需要更改。

【问题讨论】:

  • 如果我没看错,你的正则表达式是^[long list of alternatives]+$。好吧,在这种情况下,它也会匹配hello
  • 复杂的密码规则通常不会带来更安全的密码,重要的只是最小长度。人们无法记住大量的强密码,这样的规则会干扰好的密码方案。人们可以非常有创意地绕过这些规则,例如通过使用“Password-2020”等弱密码。通常,您最终会使用较弱的密码而不是较强的密码。 NIST 发布了 official paper 建议反对此类规则,并反对其以前的建议。

标签: javascript regex passwords salesforce


【解决方案1】:

你可以试试这个

^(?=.*\d)[ !"#$%&'()*+,.\/:;<=>?@[\]^`{|}~\w-]{8,}$


代码示例

const regex = /^(?=.*\d)[ !"#$%&'()*+,.\/:;<=>?@[\]^`{|}~\w-]{8,}$/gm;
const str = `1234
adnc
123456789
abcdefghij
ABCDEFGHIJ
1ABCDEFG
123-ANCNA
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

PS:- 我已经将模式中的\s 替换为,如果您需要匹配所有类型的空格字符,您可以将 替换为再次\s

【讨论】:

    【解决方案2】:

    这个怎么样:

    ^(?=.{8,})(?=.*?\d)(?=.*[\s!\"#$\%&'\(\)\*\+\,\-\.\/\:;<=>?@\[\\\]\^\_\`\{\|\}\~])(?=[a-zA-Z0-9].*?[a-zA-Z0-9].*?[a-zA-Z0-9].*?).*$
    

    如所见here at regex101.com

    说明:

    我使用了很多积极的前瞻,你可以阅读更多关于here

    基本上,前瞻确保某个位置前面有一些字符。在检查密码的开头是否符合您的所有条件后,我们然后匹配密码。
    这样想:您确保一切都正确,如果是,那么您匹配密码。否则你不会。

    (?=.{8,}) 检查是否至少有 8 个字符
    (?=.*?\d) 检查是否至少有 1 个数字
    ^(?=.{8,})(?=.*?\d)(?=.*[\s!\"#$\%&amp;'\(\)\*\+\,\-\.\/\:;&lt;=&gt;?@\[\\\]\^\_\`\{\|\}\~]) 检查是否至少有 3 个字母和/或数字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      相关资源
      最近更新 更多