正则表达式捕获组

时间:2016-02-14 12:31:52

标签: java regex

我正在尝试使用正则表达式从字符串中捕获主机地址。我的代码如下所示:

private static final Pattern OBTAIN_HOST_PATTERN = Pattern.compile("Host:\\s?(.*)");
public static String getHostAddress(String line) {
    Matcher m = OBTAIN_HOST_PATTERN.matcher(line);
    if (m.matches()) {
        return OBTAIN_HOST_PATTERN.matcher(line).group(1);
    }
    return "Pattern does not match.";
}

然后我调用getHostAddress("Host: abc");并且它给了我java.lang.IllegalStateException: No match found,这意味着它与模式匹配但是组捕获不起作用。那么,请你帮我找出为什么会发生这种情况以及我缺少什么。在此先感谢:)

编辑:我解决了这个问题。这是因为我两次获得匹配器(或者至少我认为这是原因),但有人可以解释为什么会发生这种情况吗?

2 个答案:

答案 0 :(得分:1)

声明

return OBTAIN_HOST_PATTERN.matcher(line).group(1);

既不会调用matches也不会调用find。由于if语句已找到匹配项,因此您可以执行

return m.group(1);

答案 1 :(得分:0)

您甚至可以通过命名您的小组来做得更好,这样您就可以在尝试找到相应的小组时不会对群组索引感到困惑。这可以通过以下方式来实现:

"Host:\\s?(?<mygroupname>.*)"

然后

m.group("mygroupname")

关于它的一些文档:https://blogs.oracle.com/xuemingshen/entry/named_capturing_group_in_jdk7