Ruby 文字列を *nix ファイル名と互換性のある文字列に変換する
概要
Ruby に任意の文字列があるので、それを有効な Unix/Linux ファイル名に変換したいと考えています。最初の文字列として視覚的に認識できる限り、最終的な形式がどのように見えるかは問題ではありません。いくつかの考えられる例:
"Here's my string!" => "Heres_my_string"
"* is an asterisk, you see" => "is_an_asterisk_you_see"
これ (またはこれに近い) を実現する組み込み (おそらくファイル ライブラリ内) はありますか?
解決策
仕様によれば、正規表現を置換することでこれを実現できます。この正規表現は、基本的な文字と数字以外のすべての文字に一致します。
s/[^\w\s_-]+//g
これにより、例に示すように、単語間の余分な空白が削除されます。
s/(^|\b\s)\s+($|\s?\b)/\\1\\2/g
最後に、残りのスペースをアンダースコアに置き換えます。
s/\s+/_/g
Ruby では次のようになります。
def friendly_filename(filename)
filename.gsub(/[^\w\s_-]+/, '')
.gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
.gsub(/\s+/, '_')
end