密码正则表达式:「至少有一个字母、一个数字和一个特殊字符,并且不应以特殊字符开头」。

15

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

要求如下:

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

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

  3. 不应以特殊字符开头

我已经尝试过:

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

它是有效的,但如何限制密码以特殊字符开头?如果您有比上面提到的更高效的正则表达式,请建议。

谢谢


我不会使用正则表达式来做这件事(甚至认为这是不可能的)。我会逐个字符搜索字符串并计算我的计数器。 - Ch33f
你不应该这样做 - 这是糟糕的安全实践。https://xkcd.com/936/ - Chris Moschini
1个回答

15

很简单,只需要在开头添加一个字符类

^(?=.*[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个。

  • $ 锚定正则表达式于字符串结尾。确保在我们的有效密码后面没有任何内容。

正则表达式演示

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$%可能会给你带来麻烦。我认为这不能被视为有效的。希望对你没问题 :) - nu11p01n73R
好的,我的错。我以为“\w”是用于“A-Za-z”的。谢谢。 - adiga
@nu11p01n73R:如何使其通用,例如n个特殊字符或n个大写字符? - Jitendra Pancholi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接