2012-03-31 25 views
2

我試圖讓下面的正則表達式來對我的字符串工作:獲得NULL值從Java正則表達式匹配器與發現的圖案

Pattern Regex = Pattern.compile("(?:(\\d+) ?(days?|d) *?)?(?:(\\d+) ?(hours?|h) *?)?(?:(\\d+) ?(minutes?|m) *?)?(?:(\\d+) ?(seconds?|s))?", 
Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 
Matcher RegexMatcher = Regex.matcher(myString); 
while (RegexMatcher.find()) { 
     ... 
} 

..它基本上分裂樣1天3小時成字符串匹配的正則表達式組。

我遇到的問題是,當我進入while循環時,調用RegexMatcher.group(i)將始終返回NULL值,這意味着它們在字符串中找不到。

當我嘗試輸出RegexMatcher.group(0),它返回一個空字符串,即使myString definitelly包含像"hello 1d" - 這應該返回至少第一組爲"1"而第二次作爲"d"

我檢查並檢查了正則表達式,它似乎沒問題。不知道這裏有什麼問題。

感謝:-)

+0

我有一個懷疑,它涉及到非捕獲組。 – Corbin 2012-03-31 09:47:01

+0

試圖刪除所有非捕獲組以及Pattern.CANON_EX,Pattern.UNICODE_CASE和Pattern.CASE_INSENSITIVE標誌,但無法使用 – 2012-03-31 09:55:30

+0

也嘗試刪除非捕獲組內的捕獲組並完全刪除大的非捕獲組 - 那裏沒有快樂 – 2012-03-31 09:58:54

回答

2

任何想法對於匹配m,輸入序列s,和組索引g,表述m.group(g)s.substring(m.start(g), m.end(g))是等價的。

捕獲組從左到右索引,從1開始。零組表示整個模式,因此表達式m.group(0)等於m.group()

如果匹配成功但指定的組未能匹配輸入序列的任何部分,則返回null。請注意,某些組(例如(a*))與空字符串匹配。當這個組成功匹配輸入中的空字符串時,此方法將返回空字符串。

如果要遍歷所有的比賽,你可以編寫這樣的:

Pattern Regex = Pattern 
      .compile(
        "(?:(\\d+) ?(days?|d) *?)?(?:(\\d+) ?(hours?|h) *?)?(?:(\\d+) ?(minutes?|m) *?)?(?:(\\d+) ?(seconds?|s))?", 
        Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE 
          | Pattern.UNICODE_CASE); 
    Matcher RegexMatcher = Regex.matcher("1 d 3 hours"); 
    while (RegexMatcher.find()) { 
     System.out.println(RegexMatcher.group()); 
    } 

注意m.group()相當於m.group(0)

+2

值得注意的是,一半來自http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int) – Corbin 2012-03-31 10:03:02

+0

謝謝,我想我現在得到它:) – 2012-03-31 10:19:43