2015-08-26 101 views
2

我有一個以下字符串「Mo-Sa 10:00-20:00」。我想得到兩個小組。第一組是Mo-Sa,第二組是10:00-20:00。第一組可以只包含一天,例如「Mo」。所以我認爲我需要遵循正則表達式:([MTWFSouehrao-]{2,5}) ([0-9:-]{11})。 我的Java代碼:java匹配刪除一些字符

Matcher match = Pattern.compile("([MTWFSouehrao-]{2,5}) ([0-9:-]{11})").matcher("Mo-Sa 10:00-20:00"); 
if (match.matches() && match.find(1) && match.find(2)) { 
    String s = match.group(0); // -Sa 10:00-20:00 
    String s1 = match.group(1); // -Sa 
    String s2 = match.group(2); // 10:00-20:00 
} 

爲什麼是第一組「-Sa」,而不是「莫薩」?它沒有任何意義...

回答

1

您在條件調用find(int i)

這可能不是您所期望的:它不測試是否找到索引爲i的組,但在重置匹配器後將光標移動到索引i處。

所有條件都是true,而且由於您使用的是&&,所有條件都會被評估。

因此,match.find(2)是最後一次評估,因此您的分組從您的輸入的索引2開始。

如果你只是刪除這些條件,你的輸出將是你所期望的:

if (match.matches()) { 
... 

輸出

Mo-Sa 10:00-20:00 
Mo-Sa 
10:00-20:00 

注意

爲了測試是否一組索引是匹配的,你可以使用:

  • Matcher#groupCount(),以避免對不存在的羣折射率
  • Matcher.group(int i)IndexOutOfBoundsException S和比較null,找到特定的組是否已經完成了它的條件。這將需要首先調用findmatches
  • 文檔here
+0

是的,你是對的。 find方法改變光標位置。 – Qeychon