匹配正则表达式中的第一个字符?

时间:2013-08-02 04:03:06

标签: regex

我有以下正则表达式:

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

当我将其与http://brandonhsiao.com/essays/showers.html匹配时,括号会抓取:http://brandonhsiao.com/essays/showers.html。如何抓住http://brandonhsiao.com/essays/showers.html

3 个答案:

答案 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)

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

*?与第一个斜线(即.com之后的斜线)非贪婪匹配

有关匹配组的信息,请参阅http://rubular.com/r/VmU2ghAX0k