2011-07-12 67 views
11

在Ruby中,我有一個任意字符串,我想將它轉換爲有效的Unix/Linux文件名。不管它的最終形式如何,只要它在視覺上可以識別爲它開始的字符串。一些可能的例子:將Ruby字符串轉換爲* nix文件名兼容字符串

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

是否有什麼內置的(也許在文件庫),將完成此(或接近此)?

+0

在大多數Linux文件系統中,文件名中不允許的唯一字符是'\ 0'和'/'。 '*是星號,你看'是一個完全有效的文件名。 – sepp2k

+0

@ sepp2k:好點。在這種情況下,我想創建一個文件,讓其他人可以移動或刪除它們,而不用全部拖拽:) – jrdioko

回答

18

按照你的規範,你可以用正則表達式來替代它。此正則表達式將匹配比基本字母和數字以外的所有字符:

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 
+0

謝謝。爲什麼第一個'gsub'中需要「我」? – jrdioko

+0

哦,事實並非如此。我認爲'\ w'只對應於'[a-z0-9]',但它實際上是'[a-zA-Z0-9]'。感謝您指出 - 我會編輯我的答案。 –

+0

這也消除了。 (句點)在文件名及其擴展名之間 – JoshL

2

首先,我發現它純粹是以ruby的方式提出的,其次是它的目的不同(* nix文件名兼容),但如果您使用的是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

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