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

红宝石正则表达式只去除某些点

  •  0
  • Lester  · 技术社区  · 6 年前

    我有一套绳子:

    ]  .
    ]  ..
    ]  .hu
    ]  ..ha
    ]  ho.
    ]  harr..
    

    每行是一个字符串。除了前两个我想匹配任何东西。另一个也可以包含其他字符-不仅仅是像示例字符串中那样的[a-z]。

    我尝试了很多变化,比如:

    \]\s+([^\.]{1,2}).*$
    

    但我就是不明白。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Aleksei Matiushkin    6 年前

    使用 positive lookahead :

    lines = %|]  .
    ]  ..
    ]  .hu
    ]  ..ha
    ]  ho.
    ]  harr..|.split($/)
    
    #                             ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓
    lines.select { |l| l =~ /\].*?(?=[^ \.])/ }
    #⇒ ["]  .hu", "]  ..ha", "]  ho.", "]  harr.."]
    

    上面的意思是一切,后面跟着的不是空格和圆点。

    或者,正如@WiktorStribiew在评论中建议的那样:

    lines.select { |l| l !~ /\A\s*]\s*\.{1,2}\z/ }
    
        2
  •  0
  •   Cary Swoveland    5 年前

    r = /\A(?!\]  \.\z)(?!\]  \.\.\z)/
    

    enter image description here

    arr =<<~END.split("\n")
    ]  .
    ]  ..
    ]  .hu
    ]  ..ha
    ]  ho.
    ]  harr..
    END
    

    arr.each { |s| puts "%-10s: %s" % [s, s.match?(r)] }
    ]  .      : false
    ]  ..     : false
    ]  .hu    : true
    ]  ..ha   : true
    ]  ho.    : true
    ]  harr.. : true