次のような文字列があります。
Frank's Red Hot
そして、アポストロフィを削除してスペースをアンダースコアに置き換える正規表現が必要なので、次のようになります。
franks_red_hot
全て小文字にすればおまけですが、その機能は既にあるので必要ありません。
これはさまざまな方法で行うことができます。ただし、問題を引き起こす他の考慮事項がない場合は、多くの場合、インテントのコーディングが最善の方法だと思います。個人的には、次のことをお勧めします。
"Frank's Red Hot".downcase.delete(?').tr ' ', ?_
#=> "franks_red_hot"
これにより、予期しない場所で nil を返す可能性のあるメソッド チェーン内の bang メソッドが回避されます。また、そのスタイルのコーディングを好む場合は、簡単に分解したり、複数の bang メソッドに変換したりできます。
中間値が気になる場合、またはコードをデバッグする必要がある場合は、いつでも bang メソッドを複数行で使用できます。これも、メソッド チェーン内の bang メソッドを回避します。例えば:
str = %q{Frank's Red Hot}
#=> "Frank's Red Hot"
str.downcase!
#=> "frank's red hot"
str.delete! ?'
#=> "franks red hot"
str.tr! ' ', ?_
#=> "franks_red_hot"
この手法は確かにデバッグが容易ですが、明らかに冗長です。YMMV。
s = "Frank's Red Hot"
p s.tr(' ','_').delete("'").downcase #=>"franks_red_hot"
本当に正規表現が必要ですか? これは必要に応じて機能するはずです。
string.downcase.gsub("'", '').gsub(' ', '_')
"Frank's Red Hot".downcase!.gsub!("'","").gsub!(" ","_")
質問する前に、オブジェクトのドキュメントを読んでみてください。
String#gsub
使用しているバージョンに応じて、正規表現を使用して部分文字列と一致させながら、置換パラメーターに使用してハッシュを実装できます。
str.downcase.gsub(/[' ]/, ' ' => '_')
# => franks_red_hot
ブロックでの使用:
re = { ' ' => '_' }
x = str.downcase.gsub /[' ]/ do |match|
re[match.to_s]
end
マップの使用:
map = { "'" => '', ' ' => '_' }
re = Regexp.union(map.keys)
x = str.downcase.gsub(re, map)