2011-05-24 142 views
5

我正在尋找一個Java庫,它允許匹配一系列對象,可能與諸如hamcrest之類的匹配器相混合。在某些條件下匹配流

理想我想編寫一個測試,可以檢查一個迭代包含序列看起來像一個正則表達式,但對於對象,而不是字符串:

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

的Mockito與驗證接近什麼我想,但一些簡單的匹配器丟失(如零或更多)

亞歷山大

+1

不確定爲什麼在regex下標記了這個標記。看起來像一個java問題給我。 – Mrchief 2011-06-25 03:55:01

+0

這個問題是說正則表達式形式主義適用於一系列對象,而不是一系列字符。 – 2011-06-27 21:09:19

回答

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(); 
} 
+0

我想到了這一點,它會做的工作,但聽起來有點奇怪。感謝這個解決方案 – 2011-06-28 09:46:58

1

我覺得是什麼讓你的問題,從一個共同的正則表達式匹配不同的是,你沒有語言的字母,直到你得到的圖案。因此,你需要讀一次你的模式來建立語言字母表。根據你的解釋,我想有限的一組對象是你的語言基本要素。獲得語言符號列表後,您可以使用自己的正則表達式匹配實現,也可以將流和模式轉換爲字符串(通過將對象映射到字符)並使用可用的正則表達式API之一。

3

看看這個google project called ObjRegex。它聽起來像我認爲你正在尋找的。我真的對你的問題感興趣,因爲我在C#中實現了這樣的東西,但它是專有的,我無法分享它。

+0

我還沒有嘗試lib,但它聽起來完全像我在找什麼!另一個可能的類比是CEP引擎中通常會發現的,比如[Esper](http://esper.codehaus.org/),用於對事件流進行查詢,這可能是您一直在研究的內容? – 2011-06-28 09:44:57