2016/03/05

Rubyの正規表現でそれぞれのケースへの変換

今日は正規表現に苦しんだので練習しました。
snake_case、camel_Case、Pascal_Caseのそれぞれへの変換です。
capitalizeなくても書けるけど一応。
m[0].upcase + m[1..-1]はちょっと汚いですしね。
Rubular使えばテストケースが期待通りのマッチになるまで簡単に トライ&エラーが出来ていいです。

class String
  def snake_to_camel
    self.gsub(/\b[a-z][a-z\d]*[a-z_\d]*\b/) do |match|
      match.gsub(/_[a-z\d]/) { |m| m[1..-1].capitalize}
    end
  end

  def snake_to_pascal
    self.gsub(/\b[a-z][a-z\d]*[a-z_\d]*\b/) do |match|
      match.gsub(/[a-z][a-z\d]*/) { |m| m.capitalize }
    end
  end

  def camel_to_snake
    self.gsub(/\b[a-z]+[A-Z][a-z\d]+\b/) do |match|
      match.gsub(/[A-Z][a-z\d]+/) { |m| "_" + m.downcase }
    end
  end

  def camel_to_pascal
    self.gsub(/\b[a-z]+[A-Z][a-z\d]+\b/) do |match|
      match.capitalize
    end
  end

  def pascal_to_snake
    self.gsub(/\b[A-Z][a-z\d]*([A-Z][a-z\d]+)*\b/) do |match|
      match.gsub(/[A-Z][a-z\d]*/) { |m| "_" + m }.downcase[1..-1]
    end
  end

  def pascal_to_camel
    self.gsub(/\b[A-Z][a-z\d]+([A-Z][a-z\d]+)*\b/) do |match|
      match.gsub(/\b[A-Z][a-z\d]*/) { |m| m.downcase }
    end
  end
end

© 2022 wat-aro