我正在开发一个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());
答案 0 :(得分:3)
最好使用URI类及其getHost()
和getPath()
等方法,而不是正则表达式。构造URI的规则比你可能意识到的要复杂得多,你的正则表达式可能会有很多不能正确处理的极端情况。
答案 1 :(得分:1)
如果您删除其中一个问号,请执行以下操作:
(((?:f|ht)tp(?:s)?\\://)|www)([^/]+)
它应该更好。
答案 2 :(得分:0)
替代((?:f|ht)tp(?:s)?\\://)?
是可选的,因此它可以是空字符串,然后([^/]+)
只会匹配任何不包含/
的字符串。