Ruby正则表达式仅清除某些点

时间:2018-08-17 06:56:02

标签: ruby regex

我有一组字符串:

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

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

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

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

但是我不明白。

2 个答案:

答案 0 :(得分:4)

使用positive lookahead

lines = %|]  .
]  ..
]  .hu
]  ..ha
]  ho.
]  harr..|.split($/)

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

上面的意思是“一切,紧接着是空格和点。”

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

lines.select { |l| l !~ /\A\s*]\s*\.{1,2}\z/ }

答案 1 :(得分:0)

一个可以使用两个否定的超前查询,每个不能匹配的字符串都使用一个。

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