我正在寻找一个Java库,它允许匹配一系列对象,并可能与hamcrest等匹配器混合。
理想情况下,我想写一个测试,可以检查可迭代项是否包含一个看起来像正则表达式的序列,但对于对象而不是字符串:
assertThat(myList).inSequence(oneOrMore(any()),zeroOrMore(equals(MyObject)));
带验证的Mockito接近我想要的,但缺少一些简单的匹配器(如zeroOrMore)
Alexandre
我能想到的最简单的解决方案是为每个对象构建一个带有字母的字符串,然后像往常一样使用regex。
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();
}
看看这个名为ObjRegex的谷歌项目。这听起来很像我想你在找的东西。我对你的问题很感兴趣,因为我在C#中实现了这样的东西,但它是专有的,我不能共享。
我认为您的问题与普通正则表达式匹配的不同之处在于在获得模式之前,您没有语言字母表。因此,你需要阅读一次你的模式来构建语言字母表。根据你的解释,我猜一组有限的对象是你的语言基本元素。一旦您有了语言符号的列表,您就可以使用自己的正则表达式匹配实现,或者您可以将流和模式转换为字符串(通过将对象映射到字符),并使用一个可用的正则表达式API。