我有以下正则表达式:
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
应该具有http://brandonhsiao.com
和$2
应该具有,/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'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句