为了账号安全,请及时绑定邮箱和手机立即绑定

如何匹配3个参数,包括通配符匹配?

如何匹配3个参数,包括通配符匹配?

慕后森 2022-09-07 16:39:44
我想定义一个由值组成的黑名单过滤器。让他们按照这个顺序。a, b, c为了快速查找,我想将它们连接成一个,这样我就可以快速查找。这通常工作正常。Set<String>blacklist.contains(a+b+c)问题:黑名单定义中的 3 个参数中除一个参数外的任何一个都可能被 wildcarted。因此,黑名单可能包含:*OneTwoThree*bc因此,该方法调用 。旁注:方法输入参数当然可能不是通配符,而只是普通的字符串词。isBlacklisted("One", "b", "c") = true问题是:我怎样才能更好地编写查找,如下所示?private Set<String> blacklist; //concatenation of 3 fields 'a+b+c'private boolean isBlacklisted(String a, String b, String c) {    return blacklist.contains(a+b+c)        || blacklist.contains("*"+b+c)        || blacklist.contains(a+"*"+c)        || blacklist.contains(a+b+"*")        || blacklist.contains("**"+c)        || blacklist.contains(a+"**")        || blacklist.contains("*"+b+"*");}如何创建支持通配符的快速筛选器,而不必像我一样检查所有可能的串联通配符?
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

当你写*时,你的意思是像“任何字符串”?

如果是 - 只需使用正则表达式:


for (String blacklist : blackRegex)

{

    Pattern p = Pattern.compile(blackRegex);

    Matcher matcher = p.matcher(string);

    if (matcher.find()

    {

           return true;

    }

}


return false;

blackRegex的一个例子是(someA)(someB).*

使用.*而不是*对于任何字符串,你可以按照java正则表达式指南。


查看完整回答
反对 回复 2022-09-07
?
当年话下

TA贡献1890条经验 获得超9个赞

定义一个黑名单规则类:


class BlackListRule {

    private String a;

    private String b;

    private String c;


    BlackListRule(String a, String b, String c) {

        this.a = a; this.b = b; this.c = c;

    }


    public boolean matches(String a, String b, String c) {

        return ("*".equals(this.a) || this.a.equals(a))

             &&("*".equals(this.b) || this.b.equals(b))

             &&("*".equals(this.c) || this.c.equals(c));

    }


    public int hashCode() {

        return Arrays.deepHashCode(new char[][]{a.toCharArray(), b.toCharArray(), c.toCharArray()});

    }


    public boolean equals(Object o) {

        return o instanceof BlackListRule && ((BlackListRule)o).hashCode() == hashCode();

    }

}

private Set<BlackListRule> blacklist;

private boolean isBlacklisted(String a, String b, String c) {

    return blacklist.stream().anyMatch(rule -> rule.matches(a,b,c));

}

这是一个最小的工作示例,你绝对应该改进它,但你明白了。


你可以在这里试试。


查看完整回答
反对 回复 2022-09-07
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

多亏了您的所有建议,我总结如下(假设黑名单定义来自db):对于每个“abc”黑名单元组,我创建了一个正则表达式模式。然后将这些模式与 OR 连接。|


private void init(SqlRowSet set) {

        Set<String> patterns = new HashSet<>();

        while (set.next()) {

            String a = set.getString(1);

            String b = set.getString(2);

            String c = set.getString(3);


            patterns.add(a + "/" + b + "/" + c);

        }


        regex = Pattern.compile(String.join("|", patterns));

}


private boolean isBlacklisted(String a, String b, String c) {

    return regex.matcher(a+"/"+b+"/"+c).matches();

}

现在,我可以创建我的黑名单,并将其与之匹配。a, b, .*isBlacklisted("a", "b", "anything") = true


查看完整回答
反对 回复 2022-09-07
  • 3 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号