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

Regex 此正则表达式中{1}的目的是匹配url协议,regex,Regex,我正在阅读关于如何解析网页中的URL的内容,并对提供此解决方案的解决方案提出了一个问题: ((mailto\:(news |(ht | f)tp(s?)\:/){1}\s+) 解决方案是由提出的,他把它归功于。呼。学分完成 我认为这是一个相当幼稚的正则表达式,但它是构建更好的东西的良好起点。但是,我的问题是: {1}的意义是什么?它的意思是“正好是前一组中的一个”,对吗?这不是正则表达式中分组的默认行为吗?如果删除{1},表达式是否会以任何方式更改 如果我从一位同事那里看到这一点,我会指出他或

我正在阅读关于如何解析网页中的URL的内容,并对提供此解决方案的解决方案提出了一个问题:

((mailto\:(news |(ht | f)tp(s?)\:/){1}\s+)
解决方案是由提出的,他把它归功于。呼。学分完成

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

{1}
的意义是什么?它的意思是“正好是前一组中的一个”,对吗?这不是正则表达式中分组的默认行为吗?如果删除
{1}
,表达式是否会以任何方式更改


如果我从一位同事那里看到这一点,我会指出他或她的错误,但在我写这篇文章时,回答的分数是6,而regexlib.com上的表达式的分数是5分之4。所以也许我遗漏了什么?

我认为这没有任何意义。但由于正则表达式几乎不可能理解/分解,人们很少指出错误。这可能就是为什么没有人指出这一点

@:我不同意。为了实现您的要求,我认为您需要使用否定的look-behind,这是可能的,但肯定与使用{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 >
tibook 0/home/jj33/swap>cat文本
这是文本http://example.com 这是文本
这是文本http://http://example.com 这是文本
tibook 0/home/jj33/swap>cat p
#!/usr/bin/perl
我的$re1='((mailto\:|(news |(ht | f)tp(s?)\:/){1}\s+);
我的$re2='((mailto\:|(news |(ht | f)tp(s?)\:/)\s+);
而(){
打印“评估:$\”;
如果(/$re1/),则打印“re1锯\$1=$1\n”;
如果(/$re2/),则打印“re2锯\$1=$1\n”;
}
tibook 0/home/jj33/swap>cat text | perl p
评估:这是文本http://example.com 这是文本
re1见$1=http://example.com
re2见$1=http://example.com
评估:这是文本http://http://example.com 这是文本
re1见$1=http://http://example.com
re2见$1=http://http://example.com
tibook 0/home/jj33/swap>

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

@Jeff Atwood,您的解释有点不正确,{1}表示只匹配一次,但对“捕获”没有影响-捕获是由于paren而发生的-大括号仅指定模式必须与源匹配的次数-一次,如您所说

我同意@Marius的观点,即使他的回答有点简明扼要,可能会被认为是轻率的。正则表达式是很难的,如果你不习惯使用它们的话,问题中的{1}也不完全是错误的——在支持它的系统中,它确实意味着“恰好一个匹配”。从这个意义上说,它实际上什么都没做


不幸的是,与现在删除的帖子相反,它没有阻止regexp匹配
http://http://example.org
,因为结尾的\S+将匹配一个或多个非空白字符,包括
http://example.org
in
http://http://example.org
(使用Python2.5进行验证,以防我的regexp读数被关闭)。因此,给出的regexp并不是最好的。我不是URL专家,但可能需要限制“:”s和“/”s在第一个之后的外观,以确保良好的URL。

我不认为{1}在该正则表达式中具有任何有效函数

(**mailto:|(新闻|(ht | f)tp(s?)://){1}**

你应该这样理解:“只捕获一次parens中的内容”。但我们并不真正关心捕获这些内容以供以后使用,例如在替换中使用1美元。因此,这是毫无意义的