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

使用regexp提取url的主机部分的最佳方法是什么?,regex,Regex,我正在从我的url中提取主机,并且由于设置了最后一个/可选项而被阻塞。 regexp需要准备好接收以下内容: 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 所以 你需要使用正则表达式吗?大多数语言都支持解析URL。例如

我正在从我的url中提取主机,并且由于设置了最后一个/可选项而被阻塞。 regexp需要准备好接收以下内容:

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
所以


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

我已经在PHP中测试过,它适用于您的所有示例:

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

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

(不是“@”的所有内容//可选

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

如果@出现在域之后,冒号和斜杠将阻止匹配超过域。请注意非捕获参数

(第一个“/”之前不是“/”的所有内容(如果存在) //这是我想要的主机组

([^:/]+)

注意捕获参数

(跟踪的所有其他内容)//可选

由于paren捕获主机名,并且只捕获主机名,因此无需继续匹配

所以,把所有这些放在一起,你会得到:

/^(?:ftp| https?):/(?:[^@:/]*@)?([^:/]+)/

(请注意,前两个paren分组是非捕获的——希望您的正则表达式库支持这一点。)

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