我有以下正则表达式:
http://([^:]*):?([0-9]*)(/.*)
当我将其与http://brandonhsiao.com/essays/showers.html
匹配时,括号会抓取:http://brandonhsiao.com/essays
和/showers.html
。如何抓住http://brandonhsiao.com
和/essays/showers.html
?
答案 0 :(得分:3)
在第一个*之后加上一个问号,你必须让它变得非贪婪。现在,用于匹配主机名的代码将一直抓到最后/
。
http://([^:]*?):?([0-9]*)(/.*)
但这甚至不是我推荐的。试试这个:
(http://[^\s/]+)([^\s?#]*)
$1
应该有http://brandonhsiao.com
,$2
应该有/essays/showers.html
,并且忽略任何哈希或查询字符串。
请注意,这不是为了验证一个URL而设计的,只是为了将URL划分为路径前面的部分和路径本身。例如,它很乐意接受无效字符作为主机名的一部分。但是,它适用于带或不带路径的URL。
P.S。我不确切地知道你在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'
答案 1 :(得分:0)
http://([^/:]*):?([0-9]*)(/.*)
第一组匹配除了:
之外的所有内容,现在我添加了/
,这是因为[^]
运算符意味着匹配除了组内的所有内容,其他所有内容都相同。
希望它有所帮助!
答案 2 :(得分:0)