首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >至少匹配四分之三正则表达式要求的最佳方法

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

Stack Overflow用户
提问于 2014-11-18 10:12:24
回答 2查看 290关注 0票数 6

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

  1. 下一箱。
  2. 上面的箱子。
  3. 数字。
  4. 特别的角色。

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

代码语言:javascript
复制
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{4,8}$

我知道我可以用‘\’来声明所有的组合,但是,这会产生一个超长的正则表达式。为了检查输入是否包含组合中的三个条件中的任何一个条件,什么是最好的方法来替换‘AC.26’?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-18 13:00:01

如果您使用的是PCRE口味,下面的版本可以满足您的需要(为可读性而格式化)

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

单线:

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

基于德布盖克斯的演示

JavaScript regex风味不支持递归(它实际上不支持许多东西)。最好使用4种不同的正则表达式,例如:

代码语言:javascript
复制
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}$");    
};
票数 3
EN

Stack Overflow用户

发布于 2014-11-18 12:33:15

当然,这里有一个方法,它对相同的regex进行了轻微的修改,但是需要少量的代码编写。

代码语言:javascript
复制
^(?=(\D*\d)|)(?=([^a-z]*[a-z])|)(?=([^A-Z]*[A-Z])|)(?=([a-zA-Z0-9]*[^a-zA-Z0-9])|).{4,8}$

这里有五个捕获组--检查其中至少有3个不是null。用于捕获的空组有效地指示查找内的备选方案已经匹配,而左手侧的捕获组无法匹配。

例如,在PHP中:

代码语言:javascript
复制
preg_match("/^(?=(\\D*\\d)|)(?=([^a-z]*[a-z])|)(?=([^A-Z]*[A-Z])|)(?=([a-zA-Z0-9]*[^a-zA-Z0-9])|).{4,8}$/", $str, $matches);

$count = -1; // Because the zero-eth element is never null.
foreach ($matches as $element) {
    if ( !empty($element)) {
        $count += 1;
    }
}

if ($count >= 3) {
    // ...
}

或者Java:

代码语言:javascript
复制
Matcher matcher = Pattern.compile(...).matcher(string);

int count = 0;

if (matcher.matches())
    for (int i = 1; i < 5; i++)
        if (null != matcher.group(i))
            count++;

if (count >= 3)
    // ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26991679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档