正则表达式主机名

时间:2012-03-15 12:21:59

标签: java regex

我正在开发一个http机器人,我开发了这个正则表达式 (((?:f|ht)tp(?:s)?\\://)?|www)([^/]+)检测并从链接(href)中提取主机名。 现在我把测试结果放在这里:

String -> http://www.meloteca.com/empresas-editoras.htm   
Returns   http://www.meloteca.com
String -> www.meloteca.com/empresas-editoras.htm    
Returns   www.meloteca.com
String -> /empresas-editoras.htm   
Returns   empresas-editoras.htm (without the slash)

在这种情况下,我期望正则表达式没有返回任何值?为什么会这样? 如果我尝试使用以下字符串

,同样的事情
String -> empresas-editoras.htm   
Returns   empresas-editoras.htm

代码片段:

Pattern padrao = Pattern.compile("(((?:f|ht)tp(?:s)?\\://)?|www)([^/]+)");
        Matcher mat = padrao.matcher("empresas-editoras.htm");
        if(mat.find())
            System.out.println("Host->"+mat.group());

3 个答案:

答案 0 :(得分:3)

最好使用URI类及其getHost()getPath()等方法,而不是正则表达式。构造URI的规则比你可能意识到的要复杂得多,你的正则表达式可能会有很多不能正确处理的极端情况。

答案 1 :(得分:1)

如果您删除其中一个问号,请执行以下操作:

(((?:f|ht)tp(?:s)?\\://)|www)([^/]+)

它应该更好。

答案 2 :(得分:0)

替代((?:f|ht)tp(?:s)?\\://)?是可选的,因此它可以是空字符串,然后([^/]+)只会匹配任何不包含/的字符串。