我有以下正则表达式:
http://([^:]*):?([0-9]*)(/.*)
当我将它与 匹配时http://brandonhsiao.com/essays/showers.html
,括号会抓取:http://brandonhsiao.com/essays
和/showers.html
。我怎样才能让它抓住http://brandonhsiao.com
和/essays/showers.html
?
我有以下正则表达式:
http://([^:]*):?([0-9]*)(/.*)
当我将它与 匹配时http://brandonhsiao.com/essays/showers.html
,括号会抓取:http://brandonhsiao.com/essays
和/showers.html
。我怎样才能让它抓住http://brandonhsiao.com
和/essays/showers.html
?
在第一个 * 之后放一个问号,您必须使其不贪婪。现在,您用于匹配主机名的代码正在抓取所有内容,直到最后一个/
.
http://([^:]*?):?([0-9]*)(/.*)
但这甚至不是我推荐的。试试这个:
(http://[^\s/]+)([^\s?#]*)
$1
should havehttp://brandonhsiao.com
和$2
should have/essays/showers.html
并且忽略任何散列或查询字符串。
请注意,这不是为了验证URL 而设计的,只是将 URL 分成路径之前的部分和路径本身。例如,它很乐意接受无效字符作为主机名的一部分。但是,对于带有或不带有路径的 URL,它都可以正常工作。
PS 我不知道你在 Lisp 中用这个做什么,所以我冒昧地只在其他 PCRE 兼容的环境中测试它。通常我会在使用它们的确切上下文中测试我的答案。
$_ = "http://brandonhsiao.com/essays/showers.html";
m|(http://[^\s/]+)([^\s?#]*)|;
print "1 = '$1' and 2 = '$2'\n";
# [j@5 ~]$ perl test2.pl
# 1 = 'http://brandonhsiao.com' and 2 = '/essays/showers.html'
http://([^/:]*):?([0-9]*)(/.*)
第一组匹配所有内容,但:
现在我添加了/
,这是因为[^]
运算符的意思是匹配所有内容,但组内的内容除外,其他所有内容都相同。
希望它有所帮助!