【问题标题】:Regular Expression matching at least n of m groups至少匹配 m 个组中的 n 个的正则表达式
【发布时间】:2011-10-08 01:19:15
【问题描述】:

我打算编写一个正则表达式,它仅在字符串包含至少 n 个不同类别的字符时才匹配。我打算用它来强制我的用户创建强密码,并想检查密码是否至少包含以下 3 个:

  • 字符
  • 大写字符
  • 数字
  • 特殊字符

如果所有这些类都存在,则编写一个匹配的正则表达式使用前瞻是微不足道的。但是,我不能围绕“至少 3”部分。这甚至可能(在一个漂亮、紧凑的表达式中)还是我必须创建一个怪物表达式?

【问题讨论】:

    标签: javascript regex passwords


    【解决方案1】:

    你觉得这个解决方案怎么样?

    var str='23khkS_s';
    
    var countGroups=0;
    if(str.match(/[a-z]+/))
        countGroups++;
    if(str.match(/[A-Z]+/))
        countGroups++;
    if(str.match(/[0-9]+/))
        countGroups++;
    if(str.match(/[-_!@#$%*\(\)]+/))
        countGroups++;
    
    console.log(countGroups);
    

    您可以使用 4 个小 RE,而不是使用 1 个类似怪物的表达式。然后使用变量countGroups,它包含了maеched字符组的数量。 希望对你有帮助

    【讨论】:

    • 如果他能端到端地控制整个解决方案会很好,但我怀疑他所能做的就是将正则表达式放入文本字​​段进行配置。
    【解决方案2】:

    我认为这将比列出 4 个中的 3 个的每个可能组合更紧凑。它利用负前瞻来确保整个字符串不是仅由您列出的一个或两个字符类组成:

    (?!([a-zA-Z]*|[a-z\d]*|[^A-Z\d]*|[A-Z\d]*|[^a-z\d]*|[^a-zA-Z]*)$).*
    

    按顺序,这里的组是:

    • 下和/或上
    • 低位和/或数字
    • 较低的和/或特殊的
    • 大写和/或数字
    • 上和/或特殊
    • 数字和/或特殊

    如果整个字符串(因为负前瞻中的$)仅包含来自上述任何组的字符,则此正则表达式将失败。

    【讨论】:

    • 我真的很喜欢这种方法。根本没想过颠倒逻辑。非常感谢,非常聪明!
    • 这个表达式不允许空格吗?
    • 确实如此,it is not uncommon for passwords to allow spaces。如果您需要一个不允许空格的版本,请将末尾的.* 更改为\S*
    • 同理,将末尾的* 更改为{8,} 会添加要求,“必须至少有8 个字符长”,对吧?
    • +1,非常好的逻辑:不是接受四个“复杂”案例,而是拒绝 6 个“简单”案例。整洁。
    【解决方案3】:

    您必须为 4 个中的 3 个(总共四个表达式)的每个可能组合编写一个表达式,然后 |将各个表达式放在一起,以便它们满足至少一个原始表达式时通过。

    【讨论】:

    • 这是 4 个表达式,每个表达式大约是当前正则表达式长度的 3/4,因此您的最终结果大约是当前正则表达式大小的 3 倍。还不错。
    • 我希望我不必那样做。我认为它不干净,特别是因为我将不得不一遍又一遍地重写相同的类。谢谢你的澄清。
    • 为什么不干净?创建一个执行此操作的方法并重新使用它。这比拥有一个巨大的不可读的正则表达式要好得多。
    • 这将是一个巨大的不可读的正则表达式。而且我坚持使用一个正则表达式。我无法在方法或多个函数调用中拆分任何内容。我的客户端输入验证机制的接口是单个正则表达式。
    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2013-06-14
    • 2013-05-29
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多