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

最佳正则表达式:匹配以

  •  0
  • Matchu  · 技术社区  · 15 年前

    好吧,这个很有趣。我有 A.

    我们的目标是能够找到一组以3个句点开始的行-请注意,不是单个行,而是一行中所有匹配行的集合。例如,以下是一些匹配项(每个匹配项由一个空行分隔):

    ...
    
    ...hello
    
    ...
    ...hello
    ...world
    ...
    ...wazzup?
    ...
    

    我的解决办法如下:

    ^\.\.\..*(\n\.\.\..*)*$
    

    它与所有这些都匹配,所以这就是我现在使用的-然而,重复这个过程看起来有点傻 \.\.\..* 图案有没有更简单的方法?

    test your regex 在提交之前,不要提交“应该有效”的内容。例如,我首先尝试了以下方法:

    (^\.\.\..*$)+
    

    所以我不确定是否有一个好的答案,但如果有一个答案,我将不胜感激——提前感谢!

    4 回复  |  直到 15 年前
        1
  •  1
  •   Josef Pfleger    15 年前

    在大多数正则表达式实现中,您可以缩短 \.\.\. 使用 \.{3} 所以你的解决方案会变成 \.{3}.*(\n\.{3}.*)* .

        2
  •  1
  •   Borgar    15 年前

    你已经拥有的东西已经简单易懂了。请记住,更“聪明”的regexp很可能会更慢,并且毫无疑问可读性较差。

    假设行由 \n

    ((^|\n)\.{3}[^\n]*)+
    

    我不熟悉Ruby,因此根据它返回匹配项的方式,您可能需要“非匹配”组:

    ((?:(?:^|\n)\.{3}[^\n]*)+)
    
        3
  •  1
  •   Brad Gilbert    15 年前
    ^([.]{3}.*$\n?)+
    

    这真的不需要 $ 在那里。

        4
  •  0
  •   Alex Barrett    15 年前

    你已经非常接近于解决这个问题了 (^\.\.\..*$)+ ,但因为 + 修饰符位于组的外部,每次都会被覆盖,只剩下最后一行。尝试将其包装到外部组中: ((^\.\.\..*$)+)

    结合其他建议: ((^\.{3}.*$)+)