2014-10-30 58 views
0

我正嘗試使用Java的命名捕獲組來從字符串中提取整數。我知道還有其他更簡單的方法來提取數字,但我想使用正則表達式,因爲我想確保字符串的其餘部分與模式匹配。儘管匹配找不到Java命名的捕獲組

line = "Data: 5 Total"; 
Pattern p = Pattern.compile("(Data: (?<value>\\d+) Total)"); 
Matcher m = p.matcher(line); 
assert m.matches(); 
String value = m.group("value"); 

上面的代碼失敗的回報,Exception in thread "main" java.lang.IllegalStateException: No match found

唯一組被捕獲是完整的輸入字符串,"Data: 5 Total"。 爲什麼內部命名組"value"未被捕獲?

+1

你爲什麼使用'assert'?整個斷言的觀點是,它們可以在運行時啓用或禁用,而不會改變結果([ref](http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html ))。對於正常的控制流程,它們不是**。來想一想,你怎麼知道它捕獲了完整的輸入字符串?如果'assert m.matches();'行沒有被執行,'m.group()'應該像m.group(「value」)那樣拋出一個IllegalStateException異常。 – 2014-10-30 07:07:40

+0

你說得對。我不明白當我寫這篇文章時''assert'是如何工作的。我現在已經完全取代了它。 – navari 2014-10-30 07:51:43

+0

@Alan我現在的理解是,我應該使用if語句並在else塊中拋出異常。它是否正確? – navari 2014-10-30 07:57:59

回答

1

在嘗試訪問匹配結果之前,您需要先撥打find()使正則表達式引擎找到它的匹配。您也可以移除整個模式的捕獲組,並引用group()以獲得整個匹配。

String s = "Data: 5 Total"; 
Pattern p = Pattern.compile("Data: (?<value>\\d+) Total"); 
Matcher m = p.matcher(s); 
if (m.find()) { 
    String value = m.group("value"); 
    // do something with the match result ... 
} 
+0

有沒有理由爲什麼m.matches()不夠?我覺得m.matches()隱式調用find() – navari 2014-10-30 03:58:19

+0

'matches()'方法將正則表達式與傳遞給'matcher()'的整個字符串進行匹配。如果正則表達式匹配整個字符串,則'matches()'返回true。如果不是,則返回false。 – hwnd 2014-10-30 04:03:27

+0

但是,如果在'matches()'中找到匹配項,那麼它是否也應該找到它中的組?如果字符串是「」Data:5 Total XQWEQWE「'?在這種情況下,我想通知沒有匹配完整的字符串?我是否需要額外調用'matches()'來完成該操作? – navari 2014-10-30 04:15:11