此正则表达式中{1}的目的是匹配url协议

时间:2008-08-17 02:01:56

标签: regex

我正在阅读this question,了解如何解析网页中的网址,并对提供此解决方案的accepted answer提出疑问:

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

该解决方案由csmba提供,并将其归功于regexlib.com。呼。已完成学分。

我认为这是一个相当天真的正则表达式,但它是建立更好的东西的良好起点。但是,我的问题是:

{1}有什么意义?它意味着“恰好是之前的分组之一”,对吧?这不是正则表达式中分组的默认行为吗?如果{1}被移除,表达式会以任何方式改变吗?

如果我从同事那里看到这个,我会指出他或她的错误,但是当我写这篇文章时,回复的评分为6,regexlib.com上的表达被评为4分中的4分。所以也许我错过了什么?

4 个答案:

答案 0 :(得分:3)

@ Rob:我不同意。为了强制执行你的要求我认为你需要使用负面观察,这是可能的,但肯定与使用{1}无关。这两个版本的regexp都没有解决这个特定问题。

让代码说话:

tibook 0 /home/jj33/swap > cat text
Text this is http://example.com text this is
Text this is http://http://example.com text this is
tibook 0 /home/jj33/swap > cat p
#!/usr/bin/perl

my $re1 = '((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)';
my $re2 = '((mailto\:|(news|(ht|f)tp(s?))\://)\S+)';

while (<>) {
  print "Evaluating: $_";
  print "re1 saw \$1 = $1\n" if (/$re1/);
  print "re2 saw \$1 = $1\n" if (/$re2/);
}
tibook 0 /home/jj33/swap > cat text | perl p
Evaluating: Text this is http://example.com text this is
re1 saw $1 = http://example.com
re2 saw $1 = http://example.com
Evaluating: Text this is http://http://example.com text this is
re1 saw $1 = http://http://example.com
re2 saw $1 = http://http://example.com
tibook 0 /home/jj33/swap >

所以,如果两个版本之间存在差异,那么它似乎不是您建议的版本。

答案 1 :(得分:2)

我认为{1}在该正则表达式中没有任何有效的功能。

  

(适用**的mailto:|?(新闻|(HT | F)TP(S)):// ){1} **

你应该把它读作:“准确地捕捉一些parens中的东西”。但是我们并不关心如何在以后使用它,例如替换中的1美元。所以这毫无意义。

答案 2 :(得分:1)

我认为它没有任何意义。但由于RegEx几乎不可能理解/分解,人们很少指出错误。这可能是没有人指出的原因。

答案 3 :(得分:1)

@Jeff Atwood,你的解释有点偏离 - {1}意味着只匹配一次,但对“捕获”没有影响 - 由于parens而发生捕获 - 括号只指定次数模式必须与来源匹配 - 一如你所说。

我同意@Marius,即使他的答案有点简洁,也可能因为轻率而脱落。正则表达式很难,如果不习惯使用它们,并且问题中的{1}不是错误 - 在支持它的系统中,它确实意味着“完全匹配”。从这个意义上说,它并没有真正做任何事情。

不幸的是,与现在删除的帖子相反,它不会使正则表达式与http://http://example.org匹配,因为末尾的\ S +将匹配一个或多个非空白字符,包括{{1在http://example.org中(使用Python 2.5验证,以防我的正则表达式读取关闭)。因此,给出的正则表达式并不是最好的。我不是一个URL专家,但可能是限制“:”和“//”在第一个之后出现的东西(但几乎不足以)以确保良好的URL。