问题描述
|
我正在寻找一个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的Google项目。听起来像我想您要寻找的东西。我真的对您的问题感兴趣,因为我在C#中实现了类似的功能,但是它是专有的,我无法共享。
,我认为,使您的问题与常见的正则表达式匹配不同的是,您只有在获得模式后才具有语言字母。因此,您需要阅读一次模式以构建语言字母。根据您的解释,我想您的语言基本要素是对象的有限集合。获得语言符号列表后,您可以使用自己的正则表达式匹配实现,也可以将流和模式转换为String(通过将对象映射为字符),并使用一种可用的正则表达式API。