【Ruby】正規表現で特定のパターンを除外して置換する


背景

  • http://aaa/ccchttp://aaa/bbb/ccc にしたい
  • しかし、元々、http://aaa/bbb/cccのものはそのままで良い

という状況で使えるコマンドが欲しかったです。
つまり、置換はするのですが、なんでも置換するのではなく除外するパターンもあるという除外です。

コマンド

正規表現の否定的先読みを使います

例えば、playの過去系のみ置換しないのなら、

"play plays played".gsub(/play(?!ed)/, "eat")
#=> "eat eats played"

というコマンドになります。
前述のurlに関しては、

"http://aaa/ccc".gsub(/http:\/\/aaa\/(?!bbb\/)/, "http://aaa/bbb/")
#=>"http://aaa/bbb/ccc"

"http://aaa/bbb/ccc".gsub(/http:\/\/aaa\/(?!bbb\/)/, "http://aaa/bbb/")
# => "http://aaa/bbb/ccc"