使用找到的模式从Java regex Matcher获取NULL值

时间:2012-03-31 09:43:43

标签: java regex

我正在尝试使用以下正则表达式来处理我的字符串:

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()) {
       ...
}

..它基本上将 1day 3小时之类的字符串拆分为匹配的正则表达式组。

我遇到的问题是,当我进入while循环时,对RegexMatcher.group(i)的调用将始终返回NULL值,这意味着它们未在字符串中找到。

当我尝试输出RegexMatcher.group(0)时,它返回一个空字符串,即使myString definitelly包含类似"hello 1d" - 它应至少返回第一组"1"和第二个为"d"

我检查并仔细检查了正则表达式,似乎没问题。不知道这里有什么问题。

感谢您的任何想法: - )

1 个答案:

答案 0 :(得分:2)

对于匹配器m,输入序列s和组索引g,表达式m.group(g)s.substring(m.start(g), m.end(g))是等效的。

捕获组从左到右编制索引,从1开始。组0表示整个模式,因此表达式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)