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

Jac*_*lan 1 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/"));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我将模式更改为Pattern.compile("^.+:\\d+/")匹配.我为什么需要^.+

Jon*_*eet 14

问题是你正在使用Matcher.matches(),记录为:

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

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

我想你可能想要打电话find():

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

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