使用找到的模式从 Java 正则表达式匹配器获取 NULL 值

2024-01-22

我正在尝试让以下正则表达式在我的字符串上工作:

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肯定包含类似"hello 1d"- 至少应返回第一组"1"第二个是"d".

我已经检查并仔细检查了正则表达式,看起来没问题。不知道这里出了什么问题。

感谢您的任何想法:-)


对于匹配器m,输入序列s,和组索引g, 表达式m.group(g) and 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());
    }

Note: m.group()相当于m.group(0)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用找到的模式从 Java 正则表达式匹配器获取 NULL 值 的相关文章

随机推荐