使用regexp提取网址的主机部分的最佳方法是什么?

时间:2009-02-06 01:08:22

标签: regex

我正在从我的网址中提取主机,并且通过制作最后一个/可选项而卡住了。 正则表达式需要准备好接收以下内容:

http://a.b.com:8080/some/path/file.txt
or
ftp://a.b.com:8080/some/path
or
ftp://user@a.b.com/some/path
or
http://a.b.com
or 
a.b.com/some/path

and return a.b.com

所以...

(ftp://|http://)? optionally matches the first part
then it gets hairy...
so... without adding ugly (and wrong) regexp here... just in english
(everything that isn't an '@') //optional
(everything that isn't a '/' up to the first '/' IF it's there) //this is the host group that I want
(everything else that trails) //optional

3 个答案:

答案 0 :(得分:5)

你需要使用正则表达式吗?大多数语言都支持解析URL。例如,Java有java.net.URL,Python有urlparse模块,Ruby有URI模块。您可以使用它们来查询给定URL的不同部分。

答案 1 :(得分:2)

Jeremy Ruten的答案很接近,但如果@出现在主机名后面的任何地方,则会失败。我建议:

  

(所有不是'@')//可选

(?:[^ @:/] * @)?

如果@出现在域之后,冒号和斜杠会阻止匹配通过域。注意非捕获的parens。

  

(一切都不是'/'直到第一个'/'如果它在那里)   //这是我想要的主机组

([^:/] +)

注意捕获的parens。

  

(其他一切可追溯)//可选

由于parens捕获主机名而只捕获主机名,因此无需继续匹配。

所以,把它们放在一起你得到:

/ ^(?:?FTP | HTTPS)://(?:[^ @:/] * @)([^:/] +)/

(请注意,前两个paren分组是非捕获的 - 希望你的正则表达式库支持它。)

答案 2 :(得分:0)

我在PHP中对此进行了测试,它适用于所有示例:

/^(ftp:\/\/|https?:\/\/)?(.+@)?([a-zA-Z0-9\.\-]+).*$/