javascript Regex量词不适用于我的密码验证[重复]

6qqygrtg  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(154)

此问题在此处已有答案

Regex for password must contain at least eight characters, at least one number and both lower and uppercase letters and special characters(42个答案)
昨天关门了。
我正在尝试做一个密码验证正则表达式,它必须要求大写,小写,特殊字符,数字,并且没有白色,所以我实现了以下RegEx:

/^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[.!@#$%^&*])[^\s][a-zA-Z0-9.!@#$%^&*][^\s]{8,16}$/

但我需要把超过8个字符的工作出于某种原因。
我输入的密码为:Yama#892
它应该是8个字符,但Regex不接受它,直到我像这样输入它,例如:Yama892
如果我是正确的,这是10个字符。
那么有些字符不算量词吗?如果不算,我怎么算所有8个字符?
下面是我的代码:

//...
const PASSWORD_REGEX =
  "^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[.!@#$%^&*])[^\\s][a-zA-Z0-9.!@#$%^&*][^\\s]{8,16}$";

if (password && !password.match(PASSWORD_REGEX)) {
    errors["password"] = "Password is invalid.";
  }
//...
v8wbuo2f

v8wbuo2f1#

忽略了那些看客,它说:

/^\S[a-zA-Z0-9.!@#$%^&*]\S{8,16}$/
  ^ starts with non-space
     ^ then has ONE character of the list
                         ^ then ends with 8..16 non-spaces

删除[\s]-s(顺便说一句,\S等同于它们),这样就可以正常工作了
(you不需要空格检查(?!.*\s),因为您限制了[a-zA-Z0-9.!@#$%^&*]中的字符)

sshcrbum

sshcrbum2#

@Dimava的answer已经解释了为什么你的初始Regex不接受8个字符的密码。
你可以在下面找到你的代码的清理过的工作版本:

function isValidPassword(password) {
  const PASSWORD_REGEX = /^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[^\w\s])(?!.*\s).{8,16}$/;
  return PASSWORD_REGEX.test(password);
}

console.log(isValidPassword("Yama#892"));
console.log(isValidPassword("2!Short"));
console.log(isValidPassword("Has Spaces"));
console.log(isValidPassword("noSpecialCharacter"));
console.log(isValidPassword("1234!tooLong!1234"));

改进:

1.使用\d表示数字。
1.使用[^\w\s]非字母数字字符。
1.使用test而不是match,因为我们不需要提取密码。
1.使用Lookaheads来覆盖除字符数之外的所有条件。一旦Lookaheads就位,就可以使用.{8,16}作为密码尺子,而不必限制有效字符。

相关问题