【问题标题】:Regex for Password: "Atleast 1 letter, 1 number, 1 special character and SHOULD NOT start with a special character"密码的正则表达式:“至少 1 个字母、1 个数字、1 个特殊字符,并且不应以特殊字符开头”
【发布时间】:2015-03-12 08:52:04
【问题描述】:

我需要一个密码字段的正则表达式。

要求是:

  1. 密码长度必须为 8 到 20 个字符

  2. 必须至少包含一个字母一个数字以及一个来自!@#$%^&*()_+的特殊字符。

  3. 不应以特殊字符开头

我试过了

^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])[A-Za-z\d!@#$%^&*()_+]{8,20}

它有效,但你如何限制特殊字符从密码开始?此外,如果您有比上述更高效的正则表达式,请提出建议。

谢谢

【问题讨论】:

  • 我不会用正则表达式来做到这一点(甚至不认为这是可能的)。我会逐个字符地搜索字符串 char 并有我的计数器。
  • 您不应该这样做 - 这是一种糟糕的安全做法。 xkcd.com/936

标签: javascript regex asp.net-mvc


【解决方案1】:

很简单,在开头多加一个字符类

^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])[A-Za-z\d][A-Za-z\d!@#$%^&*()_+]{7,19}$
  • [A-Za-z\d] 确保第一个字符是字母或数字。

  • [A-Za-z\d!@#$%^&*()_+]{7,19} 将匹配最少 7 个最多 19 个字符。这是必需的,因为他前面的字符类将消耗单个字符,使字符串中的字符总数最小为 8,最大为 20。

  • $ 将正则表达式锚定在字符串的末尾。确保我们的有效密码

  • 之后没有任何内容

Regex Demo

var pattern = new RegExp(/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])[A-Za-z\d][A-Za-z\d!@#$%^&*()_+]{7,19}$/);

console.log(pattern.test("!@#123asdf!@#"));

console.log(pattern.test("123asdf!@#"));

console.log(pattern.test("12as#"));

【讨论】:

  • @adiga 我看到了你的编辑。可以在前瞻中替换为\w 但它可能会给您在第一个字符类[A-Za-z\d] 中带来问题,因为\w => [A-Za-z0-9_]。注意_是一个特殊字符,如果使用输入_asdf234$%可能会给你带来麻烦。我认为这不能被视为有效。希望对你有好处:)
  • 好吧,我的错。以为 \w 是为了A-Za-z。谢谢。
  • @nu11p01n73R:如何使它像 n 个特殊字符或 n 个大写字符一样通用?
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多