मैं एक समाधान है कि पुराने एक से अलग है सुझाव देना चाहते हैं। ध्यान दें कि पुराना व्यक्ति returning
को बहिष्कृत करता है। वैसे, यह रेल के लिए विशिष्ट है, और आपने स्पष्ट रूप से अपने प्रश्न में रेल का उल्लेख नहीं किया है (केवल एक टैग के रूप में)। साथ ही, मौजूदा समाधान .doc.pdf
को _doc.pdf
में एन्कोड करने में विफल रहता है, जैसा आपने अनुरोध किया था। और, ज़ाहिर है, यह अंडरस्कोर को एक में पतन नहीं करता है।
def sanitize_filename(filename)
# Split the name when finding a period which is preceded by some
# character, and is followed by some character other than a period,
# if there is no following period that is followed by something
# other than a period (yeah, confusing, I know)
fn = filename.split /(?<=.)\.(?=[^.])(?!.*\.[^.])/m
# We now have one or two parts (depending on whether we could find
# a suitable period). For each of these parts, replace any unwanted
# sequence of characters with an underscore
fn.map! { |s| s.gsub /[^a-z0-9\-]+/i, '_' }
# Finally, join the parts with a period and return the result
return fn.join '.'
end
आप रूपांतरण के बारे में सभी विवरण निर्दिष्ट नहीं किया है:
यहाँ मेरी समाधान है। इस प्रकार, मैं निम्नलिखित मान्यताओं बना रही हूँ:
- होनी चाहिए सबसे एक फ़ाइल नाम एक्सटेंशन, जिसका अर्थ है कि वहाँ फ़ाइल नाम
- अवधि से पीछे चल में सबसे अधिक एक अवधि पर होना चाहिए एक के शुरू होने से चिह्नित नहीं करते पर विस्तार
- अग्रणी अवधि एक विस्तार
A
परे पात्रों का कोई भी क्रम की शुरुआत का प्रतीक नहीं है - Z
, a
- z
, 0
- 9
और -
एक भीमें ढह जाना चाहिए(यानी। रेखांकित अपने आप में एक को अनुमति नहीं दी चरित्र के रूप में माना जाता है, और स्ट्रिंग '$%__°#'
'_'
बन जाएगा - '___'
भागों '$%'
, '__'
और '°#'
) से बजाय
इस के जटिल हिस्सा है जहाँ मैं मुख्य भाग में फ़ाइल नाम विभाजित और विस्तार। एक नियमित अभिव्यक्ति की मदद से, मैं आखिरी अवधि की खोज कर रहा हूं, जिसके बाद अवधि के अलावा कुछ और है, ताकि स्ट्रिंग में समान मानदंडों से मेल खाने वाली कोई भी अवधि न हो। हालांकि, यह सुनिश्चित करने के लिए कुछ वर्णों से पहले होना चाहिए कि यह स्ट्रिंग में पहला अक्षर नहीं है।
समारोह परीक्षण से मेरे परिणाम:
1.9.3p125 :006 > sanitize_filename 'my§document$is°° very&interesting___thisIs%nice445.doc.pdf'
=> "my_document_is_very_interesting_thisIs_nice445_doc.pdf"
जो मुझे लगता है कि तुम क्या अनुरोध किया है। मुझे आशा है कि यह काफी अच्छा और सुरुचिपूर्ण है।
स्रोत
2012-05-30 19:41:36
यह एक अच्छा सवाल है। मेरी इच्छा है कि यह एक stdlib जवाब –