为什么这个java正则表达式不起作用?

时间:2014-02-11 10:22:22

标签: java regex

为什么此模式与我的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+/"),它确实匹配。为什么我需要^.+

2 个答案:

答案 0 :(得分:14)

问题在于您使用的是Matcher.matches(),其记录为:

  

尝试将整个区域与模式匹配。

您不希望匹配整个区域 - 您只想在区域内找到匹配

我想你可能想要拨打find()来代替:

  

尝试查找与模式匹配的输入序列的下一个子序列。

     

此方法从此匹配器区域的开头开始,或者,如果前一次方法调用成功并且匹配器尚未重置,则在第一个与上一个匹配项不匹配的字符处开始。

答案 1 :(得分:4)

这是因为Matcher#matches尝试匹配整个输入。您需要matcher#find()代替。