【问题标题】:Using regex to validate given password has alphabetic, numeric, and special characters not使用正则表达式验证给定密码是否包含字母、数字和特殊字符
【发布时间】:2019-10-18 16:25:24
【问题描述】:

我正在尝试在 JavaScript 中使用正则表达式来验证给定密码是否包含字母、数字和特殊字符。但是,我尝试过的所有方法都不起作用

我尝试过使用

/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@"#%$&])[A-Za-z0-9!@"#%$&]{8,30}$/gm

并为字母、数字和特殊字符创建单独的正则表达式变量:

let alpha = /^[A-Za-z]+$/i
let numer = /^[0-9]+$/i
let special = /^[!@#$%^&*(),.?;":{}|<>']/i

Picture of My Code

当我将 password.match(regex) 记录到控制台时,我总是看到 null

【问题讨论】:

  • 你能在问题中添加代码而不是图像吗?
  • 我知道这无关,但在使用正则表达式验证密码等内容时要小心,确保设置超时,否则您很可能会受到 ReDoS 攻击。

标签: javascript regex


【解决方案1】:

试试这个:

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

这是很久以前的帖子。可能还有其他人。简单搜索一下SO就会发现更多例子。1

这是正则表达式的可视化:

Debuggex Demo

【讨论】:

  • 嗨@nopuck4you,我希望你不介意我将可视化添加到你的帖子中——我不想为它开始一个单独的答案,因为你已经自己发布了重要的东西!
【解决方案2】:

我个人会选择单独的正则表达式,您当前正则表达式的问题是您在开头有^,在结尾有$。这意味着密码从头到尾只能包含[A-Za-z]。然后你检查密码是否从头到尾只包含[0-9]

const regexes = {
  alpha:   /[A-Za-z]/,
  number:  /[0-9]/,
  special: /[!@#$%^&*(),.?;":{}|<>']/,
  length:  /^.{8,30}$/
};

["dgXHUYuDdp", "zMv4qQfZj3", "4JXyrsq!J0", "a5Z!"].forEach(password => {
  let valid = Object.values(regexes).every(regex => password.match(regex));

  console.log(
    "password: " + JSON.stringify(password) + "\n" +
    "valid: " + valid
  );
});

【讨论】:

    【解决方案3】:

    虽然我怀疑有可能编写一个正则表达式来进行位置/序列独立匹配,但想想就头疼。因此,即使我能找到一种方法,我也不会实现它——代码需要人类可读和可解析。看看你在这里展示的内容,我想我比你更熟悉正则表达式 - 所以更有理由不这样做。

    您的字母/数字/特殊正则表达式将匹配包含字母、数字或特殊字符的字符串,而不是混合字符。如果您因此更改它们,那么您可以检查所有三个的匹配项(并在特殊的正则表达式中转义元字符):

    let alpha = /[A-Za-z]/i;
    let numer = /[0-9]/;
    let special = /[!@#$%\^&*(),\.?;":{}|<>\']/;
    if (password.match(alpha) && password.match(numer) && password.match(speicial)) {
    

    【讨论】:

    • 非常感谢这解决了我的问题!
    猜你喜欢
    • 2014-01-07
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2015-01-18
    • 2022-12-28
    • 1970-01-01
    相关资源
    最近更新 更多