将Ruby字符串转换为*nix与文件名兼容的字符串

jrd*_*oko 11 ruby string filenames

在Ruby中我有一个任意字符串,我想将它转换为有效的Unix/Linux文件名.它的最终形式看起来并不重要,只要它在视觉上可识别为它开始的字符串.一些可能的例子:

"Here's my string!" => "Heres_my_string"
"* is an asterisk, you see" => "is_an_asterisk_you_see"
Run Code Online (Sandbox Code Playgroud)

是否有内置的(可能在文件库中)可以完成此任务(或接近此)?

Jon*_*ier 19

根据您的规格,您可以通过正则表达式替换来实现此目的.此正则表达式将匹配基本字母和数字以外的所有字符:

s/[^\w\s_-]+//g
Run Code Online (Sandbox Code Playgroud)

这将删除单词之间的任何额外空格,如示例所示:

s/(^|\b\s)\s+($|\s?\b)/\\1\\2/g
Run Code Online (Sandbox Code Playgroud)

最后,用下划线替换剩余的空格:

s/\s+/_/g
Run Code Online (Sandbox Code Playgroud)

在Ruby中:

def friendly_filename(filename)
    filename.gsub(/[^\w\s_-]+/, '')
            .gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
            .gsub(/\s+/, '_')
end
Run Code Online (Sandbox Code Playgroud)


小智 5

首先,我看到它纯粹是在 ruby​​ 中被问到的,其次它的目的不同(*nix 文件名兼容),但是如果您使用的是 Rails,则有一种称为方法的方法parameterize应该会有所帮助。

在导轨控制台中:

"Here's my string!".parameterize => "here-s-my-string"
"* is an asterisk, you see".parameterize => "is-an-asterisk-you-see"
Run Code Online (Sandbox Code Playgroud)

我认为参数化符合 URL 规范,可能也适用于文件名 :)

您可以在此处查看更多信息:http : //api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

还有很多其他有用的方法。