我正在从我的网址中提取主机,并且通过制作最后一个/可选项而卡住了。 正则表达式需要准备好接收以下内容:
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
答案 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\.\-]+).*$/