javascript - 匹配至少四分之三的正则表达式要求的最佳方法

标签 javascript regex

在密码策略中,有4个要求。 它应该包含以下任何三个

  1. 小写。
  2. 大写。
  3. 数字。
  4. 特殊字符。

以下正则表达式将匹配所有情况

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{4,8}$

我知道我可以使用'|'然而,声明所有组合,这将产生一个超长的正则表达式。替换'|'的最佳方法是什么以便它可以检查输入是否包含组合中的三个条件中的任何一个?

最佳答案

如果您使用的是 PCRE 风格,则以下内容可以满足您的需求(为了便于阅读而格式化):

^(?:
    ((?=.*\d))((?=.*[a-z]))((?=.*[A-Z]))((?=.*[^a-zA-Z0-9]))|
    (?1)      (?2)         (?3)                             |
    (?1)      (?2)                      (?4)                |
    (?1)                   (?3)         (?4)                |
              (?2)         (?3)         (?4)
).{4,8}$

Regular expression visualization

单行:

^(?:((?=.*\d))((?=.*[a-z]))((?=.*[A-Z]))((?=.*[^a-zA-Z0-9]))|(?1)(?2)(?3)|(?1)(?2)(?4)|(?1)(?3)(?4)|(?2)(?3)(?4)).{4,8}$

演示 Debuggex


JavaScript 正则表达式风格不支持递归(它实际上不支持很多事情)。最好改用 4 个不同的正则表达式,例如:

var validate = function(input) {
    var regexes = [
        "[A-Z]",
        "[a-z]",
        "[0-9]",
        "[^a-zA-Z0-9]"
    ];    
    var count = 0;
    for (var i = 0, n = regexes.length; i < n; i++) {
        if (input.match(regexes[i])) {
            count++;
        }
    }    
    return count >=3 && input.match("^.{4,8}$");    
};

关于javascript - 匹配至少四分之三的正则表达式要求的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26991679/

相关文章:

javascript - 同域 AJAX 调用被第 3 方身份验证重定向

javascript - 使用 lodash 重置对象数组

javascript - 从 GoJS 中的 base64 图像字符串获取图像高度和宽度

javascript - 使用 Python 和 Selenium Webdriver 抓取 javascript

javascript - 获取属性并使用 jquery .each() 的 as 样式

mysql - 如何在 rsyslog 中仅插入来自常规日志的 mac 地址?

java - 正则表达式匹配JAVA中的特定日期格式

javascript - 用于检查护照代码的正则表达式

javascript - 正则表达式逗号分隔的电话号码

c# - 正则表达式匹配不包括下划线的字符串