2011-07-12 11 views
11

रूबी में एक मनमानी स्ट्रिंग है, और मैं इसे एक वैध यूनिक्स/लिनक्स फ़ाइल नाम के रूप में परिवर्तित करना चाहता हूं। इससे कोई फर्क नहीं पड़ता कि यह अपने अंतिम रूप में कैसा दिखता है, जब तक यह स्ट्रिंग के रूप में शुरू होने वाली दृष्टि से पहचानने योग्य हो। कुछ संभव उदाहरण:रूबी स्ट्रिंग को * nix फ़ाइल नाम-संगत स्ट्रिंग

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

क्या निर्मित (शायद फ़ाइल पुस्तकालयों में) है कि यह पूरा होगा (या पास यह करने के लिए) है?

+0

अधिकांश लिनक्स फ़ाइल सिस्टम पर फ़ाइल नामों में अनुमति देने वाले एकमात्र वर्ण '\ 0' और'/'हैं। '* एक तारांकन है, आप देखते हैं 'एक पूरी तरह से वैध फ़ाइल नाम है। – sepp2k

+0

@ sepp2k: अच्छा बिंदु। उस स्थिति में, मैं एक ऐसी फाइल बनाना चाहता हूं जो किसी के लिए अपने सभी बाल खींचने के बिना स्थानांतरित या हटाना संभव हो :) – jrdioko

उत्तर

18

अपने विनिर्देशों के अनुसार, आप इसे रेगेक्स प्रतिस्थापन के साथ पूरा कर सकते हैं। अंत में

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

और, शेष रिक्त स्थान की जगह:

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

यह शब्दों के बीच में किसी भी अतिरिक्त व्हाइट निकाल देंगे, के रूप में अपने उदाहरण में दिखाया गया: इस regex बुनियादी अक्षर और अंक के अलावा अन्य सभी पात्रों से मेल खाएगी अंडरस्कोर द्वारा:

s/\s+/_/g 

यहाँ यह रूबी में है:

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

धन्यवाद। पहले 'gsub' में "i" आवश्यक क्यों है? – jrdioko

+0

ओह, यह नहीं है। मैंने सोचा कि '\ w' केवल '[a-z0-9]' से मेल खाता है लेकिन यह वास्तव में' [a-zA-Z0-9] 'है। इसे इंगित करने के लिए धन्यवाद - मैं अपना जवाब संपादित करूंगा। –

+0

यह भी हटा देता है। (अवधि) फ़ाइल नाम और उसके विस्तार के बीच – JoshL

2

सबसे पहले, मुझे लगता है कि यह पूरी तरह से रूबी में पूछा गया था, और दूसरा यह एक ही उद्देश्य (* निक्स फ़ाइल नाम संगत) नहीं है, लेकिन यदि आप रेल का उपयोग कर रहे हैं, तो parameterize नामक एक विधि है जो मदद करनी चाहिए।

रेल कंसोल में: 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" 

मुझे लगता है कि parameterize, यूआरएल विनिर्देशों के अनुरूप होने के रूप में, फ़ाइल नाम :) के साथ भी काम कर सकते हैं

आप यहाँ के बारे में अधिक देख सकते हैं

एक और उपयोगी सहायक विधियां भी हैं।

संबंधित मुद्दे