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

标签 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 hour 这样的字符串拆分为匹配的正则表达式组。

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

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

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

感谢您的任何想法:-)

最佳答案

对于匹配器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)

关于java - 使用找到的模式从 Java 正则表达式匹配器获取 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9954817/

相关文章:

java - 在代码中使用函数时的 Eclipse 参数对话框/提示

java - 在 java config 中添加 http 安全过滤器

java - GWT PhoneGap RPC - 状态异常 0

javascript - 将字符串与正则表达式匹配返回 null

正则表达式从 postgresql 中的时间戳字符串中间删除 "-"

php - 正则表达式的可变长度lookbehind-assertion替代方案

java - Android,如何从try catch错误中显示对话框?

java - 如何通过单击 Windows 7 任务栏来关闭多个命令行窗口?

c 正则表达式和否定前瞻

c# - 在 StringBuilder 上替换 Regex 的最佳方法是什么?