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

Java 如何匹配3个参数,包括通配符匹配?,java,Java,我想定义一个由值组成的黑名单过滤器。让它们按那个顺序是a,b,c 为了快速查找,我考虑将它们连接成一个集合,以便快速查找黑名单。总的来说,这很好用 问题:黑名单定义中的3个参数中只有一个可能是通配符*。因此,黑名单可能包括: OneTwoThree *bc 因此,方法调用为BlackListDone,b,c=true。 旁注:方法输入参数当然可能不是通配符,而是纯字符串 问题是:如何才能更好地编写如下查找 private Set<String> blacklist; //conca

我想定义一个由值组成的黑名单过滤器。让它们按那个顺序是a,b,c

为了快速查找,我考虑将它们连接成一个集合,以便快速查找黑名单。总的来说,这很好用

问题:黑名单定义中的3个参数中只有一个可能是通配符*。因此,黑名单可能包括:

OneTwoThree
*bc
因此,方法调用为BlackListDone,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+"*");
}

如何创建支持通配符的快速筛选器,而不必像我那样检查所有可能的连接通配符?

定义BlackListRule类:

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();
    }
}
这是一个最低限度的工作示例,您肯定应该对其进行改进,但您明白了


您可以。

定义BlackListRule类:

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();
    }
}
这是一个最低限度的工作示例,您肯定应该对其进行改进,但您明白了


你可以。

当你写*你的意思是像任何字符串一样? 如果是-只需使用正则表达式:

blackRegex的一个例子是someAsomeB*
对于任何字符串,都可以使用。*而不是*。

当您编写*时,您的意思是像任何字符串一样? 如果是-只需使用正则表达式:

blackRegex的一个例子是someAsomeB*
对于任何字符串,都可以使用。*而不是*。

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


现在我可以用a,b,*创建我的黑名单,并将其与isBlacklisteda,b,anything=true进行匹配。

多亏了您的建议,我假设黑名单定义来自db:对于每个abc黑名单元组,我创建一个regex模式。然后将这些模式与或|连接起来


现在我可以用a,b,*创建我的黑名单,并将其与isBlackListDA,b,anything=true进行匹配,例如。

我不明白。如果a是一个通配符,那么a+b+c和*+b+c之间有什么区别呢?让我重新表述一下:黑名单可能包含定义为通配符的参数。输入参数始终是纯字符串,而不是通配符。如果黑名单中的一项是通配符,为什么不与其他两项进行比较呢?对于参数OneTw、oTh、ree,isBlackListed是否应该返回true?如果黑名单中包含onetwoo三个参数,则它当前不可用。例如,一种技术使用相同的逻辑,相反,通配符是空的。例如,它与JavaJDBC,DatabaseMetaData一起用于查询数据库结构。我不明白。如果a是一个通配符,那么a+b+c和*+b+c之间有什么区别呢?让我重新表述一下:黑名单可能包含定义为通配符的参数。输入参数始终是纯字符串,而不是通配符。如果黑名单中的一项是通配符,为什么不与其他两项进行比较呢?对于参数OneTw、oTh、ree,isBlackListed是否应该返回true?如果黑名单中包含onetwoo三个参数,则它当前不可用。例如,一种技术使用相同的逻辑,相反,通配符是空的。例如,它与JavaJDBC(DatabaseMetaData)一起用于查询数据库结构solution@membersound-我回答你的问题了吗甚至更好的方法是预编译正则表达式并将它们存储在setAbsolute中,首先要给出一个solution@membersound-我回答你的问题了吗@在这个答案的上下文中,Lino并不重要,但我还是添加了它们。@Lino在这个答案的上下文中并不重要,但我还是添加了它们。
for (String blacklist : blackRegex)
{
    Pattern p = Pattern.compile(blackRegex);
    Matcher matcher = p.matcher(string);
    if (matcher.find()
    {
           return true;
    }
}

return false;
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();
}