我正在阅读this question,了解如何解析网页中的网址,并对提供此解决方案的accepted answer提出疑问:
((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)
该解决方案由csmba提供,并将其归功于regexlib.com。呼。已完成学分。
我认为这是一个相当天真的正则表达式,但它是建立更好的东西的良好起点。但是,我的问题是:
{1}
有什么意义?它意味着“恰好是之前的分组之一”,对吧?这不是正则表达式中分组的默认行为吗?如果{1}
被移除,表达式会以任何方式改变吗?
如果我从同事那里看到这个,我会指出他或她的错误,但是当我写这篇文章时,回复的评分为6,regexlib.com上的表达被评为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。