2011-07-12 13 views
11

Ruby'de rasgele bir dizilim var ve bunu geçerli bir Unix/Linux dosya adı olan bir şeye dönüştürmek istiyorum. Son haliyle neye benzediğine bakılmaksızın, neye benzediği fark etmez. Bazı olası örnekler:Ruby string dosyasını * nix dosyaadı-adlandırılmış dizeye dönüştürme

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

şey Bunun olacak (belki dosya kütüphanelerde) yerleşik (veya yakın bu kadar) var mı?

+0

Çoğu Linux dosya sisteminde, dosya adlarında izin verilmeyen karakterler "\ 0" ve "/" şeklindedir. '* bir yıldız işaretidir, görüyorsunuz '' geçerli bir dosya adıdır. – sepp2k

+0

@ sepp2k: İyi nokta. Bu durumda, birisinin tüm saçlarını çekmeden taşımak veya silmek için mümkün olan bir dosya yapmak istiyorum :) – jrdioko

cevap

18

Spesifikasyonlarınızda, bunu bir normal ifadeyle değiştirebilirsiniz. Kalan boşlukların yerine, son olarak

s/(^|\b\s)\s+($|\s?\b)/\\1\\2/g 

Ve:

s/[^\w\s_-]+//g 

Bu örneklerde gösterildiği gibi, kelimeler arasında herhangi bir ekstra boşluğa kaldıracaktır: Bu regex temel harf ve rakamlardan dışındaki tüm karakterleri maç olacak alt çizgi ile: Burada

s/\s+/_/g 

o Ruby içinde:

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

Teşekkürler. İlk "gsub" da neden "i" gerekli? – jrdioko

+0

Oh, öyle değil. Ben sadece '[a-z0-9] 'a karşılık geldiğini düşündüm ama aslında' a-zA-Z0-9 '' dır. Bunu işaretlediğiniz için teşekkürler - Cevabımı düzenleyeceğim. –

+0

Bu da kaldırır. dosya adı ve uzantısı arasında (dönem) – JoshL

2

İlk olarak, tamamen yakut olarak sorulmuş olduğunu ve ikincinin aynı amaçla olmadığını görüyorum (* nix dosya adıyla uyumlu), ancak Rails kullanıyorsanız, yardımcı olması gereken parameterize adlı bir yöntem var. raylar konsolunda

: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

:

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

O parametrelerle ifade URL özellikleriyle uyumlu olarak, dosya adları :) ile de çalışabilir düşünüyorum

Burada hakkında daha fazla görebilirsiniz

Ayrıca bir çok faydalı yöntem daha var.