2011-02-26 60 views
1

有沒有辦法從java.util.regex.Matcher獲取文本?它似乎是隻寫的。有方法來設置它(reset(CharSequence input)),但沒有getter(除非我忽略它)。還有一種獲取模式的方法(pattern()),但文本是私人的,沒有任何吸氣。爲什麼?如何找出匹配器的狀態?

有沒有辦法找出是否嘗試過比賽, group()並捕獲IllegalStateException

我在問這個,因爲我使用Matcher作爲成員,並且不想在其他成員中重複這些信息,因爲它會不必要地破壞這個類。

回答

4

正如文檔所顯示的,您是對的:無法從匹配器中獲取文本或知道匹配操作是否已執行。

你可以封裝匹配的自定義rusable類保持狀態你在我心中:

public class StatefulMatcher { 

    private Matcher matcher; 
    private CharSequence input; 
    private boolean matchDone; 

    public StatefulMatcher(Pattern pattern, String input) { 
     this.input = input; 
     this.matcher = pattern.matcher(input); 
    } 

    public void reset(CharSequence input) { 
     this.input = input; 
     this.matcher.reset(input); 
     this.matchDone = false; 
    } 

    public boolean matches() { 
     matchDone = true; 
     return matcher.matches(); 
    } 

    public boolean isMatchDone() { 
     return matchDone; 
    } 

    public CharSequence getInput() { 
     return input; 
    } 

    // other methods 
} 
+0

這是我能做的最好的事情,但我對此並不滿意。我想稍微簡化我的類,並用許多方法創建一個添加類並不會讓它變得更簡單。 – maaartinus 2011-03-04 19:49:43

0

根據文檔,你應該能夠調用

Matcher m = ...; 
m.pattern().pattern(); 

而且它不工作?

+1

它返回'Pattern.compile(S)'使用的字符串,但我想在'模式中使用的.matcher(多個)'。 – maaartinus 2011-02-26 13:20:26

+0

你想要做什麼很奇怪。但是,我會將Matcher包裝在包含String和Matcher的Wrapper類中。 – Friesgaard 2011-02-26 13:31:44

+1

爲什麼這很奇怪?我使用'Matcher'作爲我班的成員,匹配器記得它是'text',如果我想避免單獨記住它,你認爲這很奇怪? – maaartinus 2011-02-26 13:59:00

0

我想你會得到IllegalStateException,因爲你正在嘗試在匹配器中間做些什麼? 「匹配器的顯式狀態最初是未定義的;試圖在成功匹配之前查詢匹配器的任何部分將導致拋出IllegalStateException異常。匹配器的顯式狀態由每個計算器重新計算匹配操作「。

+0

我在幾種方法中使用matcher。如果某些條件失敗,我想提供有關所發生事件的詳細信息,包括匹配位置和(未)匹配的字符串。在第一場比賽嘗試之前,有些條件會被測試。 – maaartinus 2011-02-26 13:23:58

相關問題