匹配特定条件的流

时间:2011-05-24 10:15:38

标签: java regex testing stream pattern-matching

我正在寻找一个允许匹配一系列对象的Java库,可能会与诸如hamcrest的匹配器混合使用。

理想情况下,我想编写一个测试,可以检查迭代是否包含看起来像正则表达式的序列,但对于对象而不是字符串:

assertThat(myList).inSequence(oneOrMore(any()),zeroOrMore(equals(MyObject)));

Mockito验证是我想要的,但是缺少一些简单的匹配器(比如zeroOrMore)

亚历山大

3 个答案:

答案 0 :(得分:4)

我能想到的最简单的解决方案是为每个对象构建一个带字母的字符串,然后像往常一样使用正则表达式。

public boolean matchObjects() {
    Object a = new Object();
    Object b = new Object();
    Object c = new Object();
    Object d = new Object();
    ArrayList<Object> arrayList = new ArrayList<Object>();
    arrayList.add(a);
    arrayList.add(b);
    arrayList.add(c);
    arrayList.add(b);
    arrayList.add(d);
    Iterable<Object> iterable = arrayList;
    String result = "";
    for (Object object : iterable) {
        if (object.equals(a))
            result += "a";
        else if (object.equals(b))
            result += "b";
        else if (object.equals(c))
            result += "c";
        else if (object.equals(d))
            result += "d";
        else
            result += "x";
    }
    Pattern pattern = Pattern.compile("a.*b");
    return pattern.matcher(result).find();
}

答案 1 :(得分:3)

看看这个google project called ObjRegex听起来就像我认为你正在寻找的那样。我真的对你的问题感兴趣,因为我在C#中实现了这样的东西,但它是专有的,我不能分享它。

答案 2 :(得分:1)

我认为使您的问题与常见的正则表达式匹配不同的是 在获得模式 之前,您没有语言字母。因此,您需要阅读一次模式以构建语言字母表。根据您的解释,我猜 一组有限的对象 是您的语言基本元素。获得语言符号列表后,您可以使用自己的正则表达式匹配实现,也可以将流和模式转换为String(通过将对象映射到字符)并使用其中一个可用的正则表达式API。