我正在尝试使用正则表达式从字符串中捕获主机地址。我的代码如下所示:
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
,这意味着它与模式匹配但是组捕获不起作用。那么,请你帮我找出为什么会发生这种情况以及我缺少什么。在此先感谢:)
编辑:我解决了这个问题。这是因为我两次获得匹配器(或者至少我认为这是原因),但有人可以解释为什么会发生这种情况吗?
答案 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