Преобразование строки Ruby в * nix-совместимую с файлами строку

В Ruby у меня есть произвольная строка, и я бы хотел преобразовать ее в то, что является допустимым именем файла Unix/Linux. Не имеет значения, как это выглядит в его окончательной форме, если оно визуально распознается как строка, в которой она начиналась. Некоторые возможные примеры:

"Here my string!" => "Heres_my_string"
"* is an asterisk, you see" => "is_an_asterisk_you_see"

Есть ли что-нибудь встроенное (возможно, в библиотеках файлов), которое выполнит это (или близко к этому)?

Ответ 1

По вашим спецификациям вы можете выполнить это с заменой регулярного выражения. Это регулярное выражение будет соответствовать всем символам, кроме основных букв и цифр:

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

Ответ 2

Во-первых, я вижу, что он был задан исключительно в рубине, и во-вторых, это не та же самая цель (* nix filename compatible), но если вы используете Rails, существует метод под названием parameterize, который должен помочь.

В консоли rails:

"Here my string!".parameterize => "here-s-my-string"
"* is an asterisk, you see".parameterize => "is-an-asterisk-you-see"

Я думаю, что параметризация, как совместимая с спецификациями URL, может также работать с именами файлов:)

Вы можете увидеть больше здесь: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

Там также много других полезных методов.