Techioz Blog

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