Сравнение коллекций Reg Ex Patterns - PullRequest
1 голос
/ 13 сентября 2011

Короче, как мне лучше проверить, равны ли две коллекции шаблонов Reg Ex (игнорируя порядок)?

Чуть больше информации о том, что я на самом деле пытаюсь сделать с этим, у меня есть объект, который яПри использовании для фильтрации сообщений журнала этот объект фильтра содержит коллекции для каждой вещи, по которой он может быть использован для фильтрации, одна из этих вещей - шаблоны Reg Ex.Я создал метод equals для моего объекта фильтрации, чтобы я мог видеть, являются ли два фильтра в основном одинаковыми, для других коллекций я могу использовать метод collection .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, который написан по-разному, но соответствует одному и тому же?

Ответы [ 2 ]

4 голосов
/ 13 сентября 2011

Проблема в том, что класс 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-collection CollectionUtils # isEqualCollection , чтобы сравнивать их независимо от порядка.Посмотрите на этот вопрос SO для получения дополнительной информации: Есть ли способ проверить, если две коллекции содержат одинаковые элементы, независимо от порядка?

Я не думаю, что есть простойспособ сопоставления двух регулярных выражений, которые имеют разные шаблоны, но соответствуют одному и тому же тексту.Одним из способов может быть создание списка тестовых строк, которые вы можете запускать для каждого регулярного выражения, чтобы увидеть, совпадают ли они.

0 голосов
/ 12 июня 2014

Я просто ответил довольно похожий вопрос относительно сравнения одного Pattern, поскольку это проблематично, так как его flag игнорируется при сравнении. Потому что список или их массив - это почти то же самое, что любой, кто сталкивается с этим вопросом, тоже может посмотреть там.

Относительно несортированных чеков см. ответ собачьей страхи .

...