Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较Reg-Ex模式的集合_Java_Regex_Collections_Compare_Equals - Fatal编程技术网

Java 比较Reg-Ex模式的集合

Java 比较Reg-Ex模式的集合,java,regex,collections,compare,equals,Java,Regex,Collections,Compare,Equals,简而言之,如何最好地检查两个Reg-Ex模式集合是否相等(忽略顺序) 关于我实际使用它做什么的更多信息,我有一个用于过滤日志消息的对象,这个过滤对象包含它可以用来过滤的每件事情的集合,其中一件事情是Reg Ex模式。我已经为我的筛选对象创建了一个equals方法,因此我可以查看两个过滤器是否基本相同,对于其他集合,我可以使用collections.equals方法,但是我对模式对象有问题 我可以将模式的字符串输入列表保存在不同的列表中,并将字符串列表与.equals进行比较,或者我可以运行所有对

简而言之,如何最好地检查两个Reg-Ex模式集合是否相等(忽略顺序)

关于我实际使用它做什么的更多信息,我有一个用于过滤日志消息的对象,这个过滤对象包含它可以用来过滤的每件事情的集合,其中一件事情是Reg Ex模式。我已经为我的筛选对象创建了一个equals方法,因此我可以查看两个过滤器是否基本相同,对于其他集合,我可以使用collections.equals方法,但是我对模式对象有问题

我可以将模式的字符串输入列表保存在不同的列表中,并将字符串列表与.equals进行比较,或者我可以运行所有对象,并逐个检查它们(如果有)。toString与其他列表中的某些内容相匹配,如下所示:

        boolean equals = true;
        for (Pattern p1: patternList1) {
            boolean found = false;
            for (Pattern p2: patternList2) {
                if(p1.toString().equals(p2.toString())) {
                    found = true;
                    break;
                }
            }
            if(!found) {
                equals = false;
                break;
            }
        }
        if(equals) {
            for (Pattern p1: patternList2) {
                boolean found = false;
                for (Pattern p2: patternList1) {
                    if(p1.toString().equals(p2.toString())) {
                        found = true;
                        break;
                    }
                }
                if(!found) {
                    equals = false;
                    break;
                }
            }
        }
        return equals;

这个dos看起来不是很有效,但是可以工作,但是如果两个regexp模式匹配相同但写得不同,它就无法捕获。如何以不同方式优化/执行上述代码?是否有任何“简单”的方法可以捕获写入不同但匹配相同的reg-ex?

这里的问题是
模式
类没有实现
equals()
,因此您无法轻松比较集合。要解决这个问题,请创建您自己的模式包装器类,它包含一个
模式
,并实现
equals()
。例如:

public class PatternWrapper{
    private final Pattern pattern;

    public PatternWrapper(Pattern p) {
        this.pattern = p;
    }

    /**
     * @return the pattern
     */
    public Pattern getPattern() {
        return pattern;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((pattern == null) ? 0 : pattern.hashCode());
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == this)
            return true;
        if (!(obj instanceof PatternWrapper))
            return false;
        PatternWrapper other = (PatternWrapper) obj;
        if (pattern == null) {
            if (other.pattern != null)
                return false;
        } else if (!pattern.toString().equals(other.pattern.toString()))
            return false;
        return true;
    }
}
现在,您可以在集合中存储
PatternWrapper
对象

由于在比较集合时希望忽略排序,因此不能简单地在两个集合之间调用
equals
,因为这将比较相应的元素。但是,您可以使用另一个库(如ApacheCommons集合)独立于顺序对它们进行比较。有关更多信息,请查看此SO问题:


我不认为有一种简单的方法可以匹配两个具有不同模式但匹配相同文本的正则表达式。一种方法可能是有一个测试字符串列表,您可以对每个正则表达式运行这些测试字符串,以查看它们是否匹配。

这里的问题是
模式
类没有实现
equals()
,因此您无法轻松比较集合。要解决这个问题,请创建您自己的模式包装器类,它包含一个
模式
,并实现
equals()
。例如:

public class PatternWrapper{
    private final Pattern pattern;

    public PatternWrapper(Pattern p) {
        this.pattern = p;
    }

    /**
     * @return the pattern
     */
    public Pattern getPattern() {
        return pattern;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((pattern == null) ? 0 : pattern.hashCode());
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == this)
            return true;
        if (!(obj instanceof PatternWrapper))
            return false;
        PatternWrapper other = (PatternWrapper) obj;
        if (pattern == null) {
            if (other.pattern != null)
                return false;
        } else if (!pattern.toString().equals(other.pattern.toString()))
            return false;
        return true;
    }
}
现在,您可以在集合中存储
PatternWrapper
对象

由于在比较集合时希望忽略排序,因此不能简单地在两个集合之间调用
equals
,因为这将比较相应的元素。但是,您可以使用另一个库(如ApacheCommons集合)独立于顺序对它们进行比较。有关更多信息,请查看此SO问题:

我不认为有一种简单的方法可以匹配两个具有不同模式但匹配相同文本的正则表达式。一种方法可能是有一个测试字符串列表,您可以对每个正则表达式运行这些字符串,以查看它们是否匹配。

我只是一个关于比较一个
模式的类似问题,因为这是有问题的,因为在比较它们时忽略了它的
标志。因为任何遇到这个问题的人都可能会在那里看到一个列表或一个数组

关于未排序的检查,请参见。

关于比较一个
模式,我提出了一个非常类似的问题,因为这是有问题的,因为在比较它们时忽略了它的
标志。因为任何遇到这个问题的人都可能会在那里看到一个列表或一个数组


关于未排序的检查,请参见。

除非您有重复的模式并且没有一直比较它们,否则您可以在比较之前将模式放入集合中。识别两个正则表达式完全匹配同一组字符串并非易事。您必须将每个模式简化为一个所谓的最小确定性有限状态机,并对它们进行比较。非常感谢,我觉得这与模式中的.equals有关,这是我的问题,但不确定。另外,我对其他过滤选项的排序没有问题的原因是,模式是我唯一一次进入列表的选项,其余的都是成套的,所以感谢您指出这一点。除非您有重复的模式并且不总是比较它们,在比较之前,您可以将模式放入集合中。识别两个正则表达式完全匹配同一组字符串并非易事。您必须将每个模式简化为一个所谓的最小确定性有限状态机,并对它们进行比较。非常感谢,我觉得这与模式中的.equals有关,这是我的问题,但不确定。另外,我对其他过滤选项的排序没有问题的原因是,只有当我进入列表时,模式才是唯一的,其余的都是集合,所以感谢您指出这一点。