2013-01-03 85 views
0

雖然提取輸入串指定的數據,一個使用Matcher.group(字符串組名) http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html有沒有更好的方法來使用Matcher中的group()提取名稱值?

在下面的代碼,receivedData是具有的基團的名稱的散列映射。我必須遍歷它才能獲取每個名稱,然後調用組(名稱)。 散列表必須單獨維護,並且可能會錯誤地輸入名稱或與正則表達式中的名稱不同步,因爲它們中有大量名稱。

String patternOfData = "On (day) I ate (mealName) at (restaurant) where they had a deal (entree) for only (price)"; 

編譯模式後,

Pattern dataExtractionPattern = Pattern.compile(patternOfData); 

Matcher matcher = dataExtractionPattern.matcher(receivedDataString); 
       boolean b = matcher.matches(); 
       if (!b) { 
        return false; 
       } 
       for (String key : receivedData.keySet()) { 
        String dataValue; 
        dataValue = matcher.group(key); 
        receivedData.put(key, dataValue); 
       } 
       return true; 

難道不更好,如果我們不得不返回兩個名稱和值一起?像Map.entry group();

或者有另一種方法可以做到這一點嗎?

回答

1

首先,一個名爲捕獲組,在Java 7新提供的,看起來像(?< NAME>PATTERN),其中NAME是該組的名稱和PATTERN是模式匹配。所以你的例子正則表達式就像On (?<day>\S+) I ate (?<mealName>\S+)...

如果模式是固定的,那麼沒有理由不能有一個固定的組名列表。然後,您可以從頭開始構建receivedData,迭代這些組名稱,而不需要使用正確的鍵設置它。

+0

該文檔不清楚命名捕獲組。 「以(?開頭的組是純粹的非捕獲組,不捕獲文本並且不計入組總數或命名捕獲組。」http://docs.oracle.com/javase/7/docs /api/java/util/regex/Pattern.html#groupname – likejiujitsu

+0

請參閱[此鏈接](https://blogs.oracle.com/xuemingshen/entry/named_capturing_group_in_jdk7)。 –

+0

Javadocs for Pattern「(? X)\t。 .... X,作爲一個命名捕獲組「。好吧,我明白你爲什麼把一個」\ S「捕獲非空白字符 – likejiujitsu

相關問題