【问题标题】:Convert Ruby string to *nix filename-compatible string将 Ruby 字符串转换为 *nix 文件名兼容的字符串
【发布时间】:2011-10-04 01:47:32
【问题描述】:

在 Ruby 中,我有一个任意字符串,我想将其转换为有效的 Unix/Linux 文件名。它的最终形式是什么样的并不重要,只要它在视觉上可以识别为它开始时的字符串即可。一些可能的例子:

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

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

【问题讨论】:

  • 在大多数 Linux 文件系统上,文件名中唯一不允许出现的字符是 \0/* is an asterisk, you see 是一个完全有效的文件名。
  • @sepp2k:好点。在这种情况下,我想制作一个文件,让某人可以移动或删除而不用拔掉他们所有的头发:)

标签: ruby string filenames


【解决方案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

【讨论】:

  • 谢谢。为什么第一个gsub中的“i”是必需的?
  • 哦,不是。我以为\w 只对应于[a-z0-9],但实际上是[a-zA-Z0-9]。感谢您指出这一点——我会编辑我的答案。
  • 这也删除了 . (句点)在文件名及其扩展名之间
【解决方案2】:

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

在 Rails 控制台中:

"Here's 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

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

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 2011-02-22
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多