【问题标题】:Password policy requirement regex密码策略要求正则表达式
【发布时间】:2020-02-20 07:20:43
【问题描述】:

我需要一个正则表达式来满足此密码策略要求 最少八 (8) 个字符 至少一个数字 (0-9) 以下任意三项: 小写 大写 数字 特殊字符 ( !" # $ % & ' ( ) * + , - 。 / : ; ? @ [ \ ] ^ _ ` { | } ~ )

现在我正在使用这个正则表达式至少八 (8) 个字符

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

这个正则表达式没有按预期工作,它正在接受输入 testtest1 作为正确的匹配。它应该将此 test@test1,Testtest12 作为正确的输入

【问题讨论】:

  • 以下任意三个:小写大写数字特殊字符在正则表达式中这样做会很烦人。可能,但请考虑以编程方式实现它。
  • 在我看来,您好像没有转义具有特殊含义的字符。你也不能实现一些 ASCII 字符类吗?
  • 但是testtest1 确实有一个数字和Any three of the following: Lowercase Uppercase Number Special character 对吗?如果你想要这三个中的任何一个,它将匹配 regex101.com/r/iqgvsm/1 如果应该有一个大写或特殊字符 regex101.com/r/sbI8m9/1
  • 如何使用多种模式,例如,一种检查小写字符,一种检查大写字符,一种检查数字,另一种检查特殊...如果您全部应用它们,您可以轻松确定有多少标准匹配;)
  • @SalmanKhan 只是为了完整性,你的正则表达式知道空格......你可能也想将它们添加到另一个正则表达式中

标签: javascript regex passwords


【解决方案1】:

该模式将匹配 testtest1,因为您只声明了一个必需的数字,并且后续字符类 [ !#$%&amp;()*+,.\/:;&lt;=&gt;?@[\]^{|}~\w-]{8,}` 将重复匹配至少 8 次列出的任何一个。


如果您还想断言大写字符 A-Z 或特殊字符,您可以使用另一个带有 alternation 的正向前瞻

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

Regex demo

注意我省略了匹配空格,如果你想匹配它,你可以在字符类中添加一个空格(不确定你是否允许密码中的空格)

【讨论】:

    【解决方案2】:

    你需要稍微改变你的前瞻部分。

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

    (?=.{8,}) = 最少八个字符长度(正向预测)

    (?=.*[0-9].*) = 至少一个数字(正向预测)

    (.*[\!"#$%&amp;'\(\)\*+,\-.\/:;&lt;=&gt;?@\[\\\]^_{|}~].*){3,}` 列表中的任何字符至少出现 3 次

    【讨论】:

    • 请注意,正向前瞻中的最终.* 是无用的。在完成捕获组中,它甚至是危险的,因为它可能导致灾难性的回溯(here 已经超过 100k 次迭代失败)!此外,它不满足要求,因为“任意三个”你忘记了大小写字符。
    猜你喜欢
    • 2012-04-12
    • 2020-10-09
    • 2016-10-20
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多