簡體   English   中英

比較Reg Ex Patterns的集合

[英]Comparing collections of Reg Ex Patterns

簡而言之,我如何最好地檢查Reg Ex Patterns的兩個集合是否相等(忽略順序)?

關於我實際嘗試用它做什么的更多信息,我有一個用來過濾日志消息的對象,這個過濾器對象包含可用於過濾的每個東西的集合,其中一個是Reg Ex模式。 我已經為我的過濾對象創建了一個equals方法,所以我可以看到兩個過濾器是否基本相同,對於其他集合,我可以使用集合.equals方法,但我對Pattern對象有問題。

我可以在不同的列表中保存模式的字符串輸入列表,並將字符串列表與.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;

這看起來不太有效,但可行,但如果兩個正則表達式匹配相同但寫入不同,則無法捕獲。 上述代碼如何以不同方式優化/完成? 是否有任何“簡單”的方法來捕獲不同但匹配相同的reg ex?

這里的問題是Pattern類沒有實現equals() ,所以你不能輕易地比較集合。 要解決這個問題,請創建自己的Pattern包裝類,它包含一個Pattern並實現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 ,因為這將比較相應的元素。 但是,您可以使用另一個庫(如Apache commons-collections CollectionUtils#isEqualCollection)來獨立於順序進行比較。 看看這個SO問題了解更多信息: 有沒有辦法檢查兩個集合是否包含相同的元素,與訂單無關?

我不認為有一種簡單的方法可以匹配兩個具有不同模式但匹配相同文本的正則表達式。 一種方法可能是擁有一個測試字符串列表,您可以針對每個正則表達式運行它們以查看它們是否匹配。

我剛剛回答了一個關於比較一個Pattern的相當類似的問題,因為它有問題,因為在比較它時它的flag被忽略了。 因為這些問題的列表或數組幾乎與遇到這個問題的人一樣。

關於未分類檢查,請參閱dogbane的回答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM