2

我有以下正则表达式:

http://([^:]*):?([0-9]*)(/.*)

当我将它与 匹配时http://brandonhsiao.com/essays/showers.html,括号会抓取:http://brandonhsiao.com/essays/showers.html。我怎样才能让它抓住http://brandonhsiao.com/essays/showers.html

4

3 回答 3

3

在第一个 * 之后放一个问号,您必须使其不贪婪。现在,您用于匹配主机名的代码正在抓取所有内容,直到最后一个/.

http://([^:]*?):?([0-9]*)(/.*)

但这甚至不是我推荐的。试试这个:

(http://[^\s/]+)([^\s?#]*)

$1should havehttp://brandonhsiao.com$2should 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'
于 2013-08-02T04:09:33.520 回答
0
http://([^/:]*):?([0-9]*)(/.*)

第一组匹配所有内容,但:现在我添加了/,这是因为[^]运算符的意思是匹配所有内容,但组内的内容除外,其他所有内容都相同。

希望它有所帮助!

于 2013-08-02T04:09:24.847 回答
0

http:\/\/([^:]*?)(\/.*)

*?是与第一个斜杠(.com 之后的那个)的非贪婪匹配

有关匹配组,请参见http://rubular.com/r/VmU2ghAX0k

于 2013-08-02T04:21:00.503 回答