代码之家  ›  专栏  ›  技术社区  ›  jj33

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

  •  4
  • jj33  · 技术社区  · 16 年前

    this question 关于如何解析网页中的URL,有一个关于 accepted answer

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

    csmba 他把这归功于 regexlib.com . 呼。学分完成。

    这有什么意义 {1} ? 它的意思是“正好是前一组中的一个”,对吗?这不是正则表达式中分组的默认行为吗?如果 {1} 被移除了吗?

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

    4 回复  |  直到 7 年前
        1
  •  3
  •   Community Jaime Torres    7 年前

    @ Rob

    让代码说话:

    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 >
    

        2
  •  2
  •   Jeff Atwood    16 年前

    我认为{1}在这个正则表达式中没有任何有效的函数。

    ){1}**

    你应该把它理解为:“只捕捉一次帕伦家的东西”。但是,我们并不真正关心捕获这些信息以供以后使用,例如在替换中使用1美元。所以这是毫无意义的。

        3
  •  1
  •   Blair Conrad    16 年前

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

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

    不幸的是,与现在删除的帖子相反,它并没有阻止regexp匹配 http://http://example.org http://example.org 在里面

        4
  •  1
  •   Andrew Barber Tejas Tank    11 年前

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