这是您(最有可能)需要的:
[a-z]+://([^/ ]+)(?:/[^/ ]*/?)?
以下是它的工作原理:
[a-z]+
部分用于协议名称(这意味着“1 个或多个字母” - 它将匹配 http/https/file/ftp/gopher/foo/whatever 协议,但如果您只想匹配“http”,则可以显式编写)
://
字面意思是它所说的;)
[^/ ]+
是一个或多个非斜线和非空格字符。它可以是“a”,可以是 fqdn,可以是 IP 地址。任何
(?:/[^/ ]*/?)?
- 这个比较复杂。?
到底意味着括号中的整个事情可能存在也可能不存在(它是可选的)。?:
紧接在括号内的意思是不要重用这个子模式(它没有分配一个数字,以后不能被那个数字重用)。[^/ ]*
表示 0 个或多个非斜杠非空格字符,并且斜杠后面的问号再次表明斜杠是可选的。
总体而言,这确保了以下内容的匹配:
http://foo/bar/baz/something -> http://foo/bar/
http://hello.world.example.com/ -> http://hello.world.example.com/
http://foo.net -> http://foo.net
ftp://ftp.mozilla.org/pub -> ftp://ftp.mozilla.org/pub
注意#1:我没有故意对正斜杠使用转义以使表达式更具可读性,因此请确保使用其他字符作为delimiter
,或者转义所有出现的/
- 使用\/
。
注意#2:i
如果您希望表达式不区分大小写(a-z
将不匹配大写字母),请添加修饰符,g
如果您想在一大块文本中进行多个匹配,请添加修饰符。
在比赛中,子模式 0 将是整个匹配的东西,而子模式 1 - 只有主机名