这两个正则表达式之间有什么区别来捕获页面上的内部链接?

时间:2016-10-14 05:24:40

标签: ruby regex

我希望能够匹配页面上内部链接的锚点部分,即:

"#Welcome"
"#aboutus"
"#services"
"#contactus"

为此,我尝试了这两种正则表达式:

  1. /#\w*\W*/ - http://www.rubular.com/r/I3G9X7zkvS
  2. /#(\w*)(\W*)/ - http://www.rubular.com/r/b4Eaar1Tn7
  3. 但是如果你访问这些页面中的每一个,你会注意到由于某种原因,它们都跳过第二个测试字符串 - 我觉得很奇怪。

    所以我的问题是三部分:

    1. 这两者有区别吗?如果是这样,有什么区别?
    2. 为什么那些链接中的测试样本中的第二个字符串都没有?
    3. 是否还有其他规则可能需要正确捕获文档的任何内部链接?是否允许内部链接包含这些正则表达式未捕获的符号和其他奇怪字符?

1 个答案:

答案 0 :(得分:3)

TL; DR \W*贪婪且与换行符匹配,导致正则表达式换行并在下一行开头匹配#线。这打破了第二场潜在的比赛。

您可以使用\W*替换正则表达式中的[^\w\n]*来解决此问题,如此正则表达式:

/#(\w*)([^\w\n]*)/

Demo

您的问题:

  
      
  1. 这两者有区别吗?如果是这样,有什么区别?
  2.   

唯一的区别是第二个正则表达式使用捕获组。否则,他们是一样的。

  
      
  1. 为什么那些链接中的测试样本中的第二个字符串都没有?
  2.   

\W*匹配任何非字字符,即[^a-zA-Z0-9_]。这意味着它匹配新行字符\n和下一行开头的#。换句话说,它"包装"并防止正则表达式匹配第二行。有关您的正则表达式,请参阅以下演示:/#\w*\W*//#(\w*)(\W*)/

  
      
  1. 是否还有其他规则可能需要正确捕获文档的任何内部链接?是否允许内部链接包含这些正则表达式未捕获的符号和其他奇怪字符?
  2.   

是。虽然散列(#)是指示内部链接(a / k /锚链接或散列链接)的唯一方法,但有很多方法可以创建链接。也就是说,它可能不在HTML本身中。这里有很多可能性,例如完全限定的URL(http://example.com/foo/bar#baz),JavaScript链接和许多其他怪癖。当然,您的文字可能与您的正则表达式(#2 pencil)不匹配,但不是链接。但试图谈论所有这些问题会使这个答案太长(并且会使你的问题过于宽泛)。