为什么此模式与我的URL中的端口不匹配?
public class PatternTest {
private Pattern PORT_STRING_PATTERN = Pattern.compile(":\\d+/");
private boolean hasPort(String url) {
return PORT_STRING_PATTERN.matcher(url).matches();
}
@Test
public void testUrlHasPort() {
assertTrue("does not have port", hasPort("http://www.google.com:80/"));
}
}
如果我将模式更改为Pattern.compile("^.+:\\d+/")
,它确实匹配。为什么我需要^.+
?
答案 0 :(得分:14)
问题在于您使用的是Matcher.matches()
,其记录为:
尝试将整个区域与模式匹配。
您不希望匹配整个区域 - 您只想在区域内找到匹配。
我想你可能想要拨打find()
来代替:
尝试查找与模式匹配的输入序列的下一个子序列。
此方法从此匹配器区域的开头开始,或者,如果前一次方法调用成功并且匹配器尚未重置,则在第一个与上一个匹配项不匹配的字符处开始。
答案 1 :(得分:4)
这是因为Matcher#matches
尝试匹配整个输入。您需要matcher#find()
代替。