/ / नियमित अभिव्यक्तियों का उपयोग कर फ़ाइल नाम छंटनी - रूबी, रेगेक्स, सॉर्टिंग

नियमित अभिव्यक्तियों का उपयोग करके फ़ाइल नाम छंटनी - रूबी, रेगेक्स, सॉर्टिंग

मेरे पास एक निर्देशिका है जिसमें 200 फाइलें (.txt) हैं और मैं फ़ाइल नाम के एक निश्चित भाग पर एक नियमित अभिव्यक्ति का उपयोग करके उन्हें सॉर्ट करना चाहता हूं।

उदाहरण फ़ाइल नाम हैं:

W:/name/2014-09-02 - name/20140902-070343_1-P4.txt
W:/name/2014-09-02 - name/20140902-070343_10-P4.txt
W:/name/2014-09-02 - name/20140902-070343_2-P4.txt
W:/name/2014-09-02 - name/20140902-070343_200-P4.txt

जो सरणी में एक ही प्रारूप में हैं।

नीचे दिया गया कोड फ़ाइल नामों को सरणी में संग्रहीत करेगा। मैं फिर एक नियमित अभिव्यक्ति का उपयोग कर सॉर्ट करना चाहता हूं _1, _200, _10 _2 फ़ाइल नाम का हिस्सा।

require "FileUtils"
contents = Dir.glob("W:/name/2014-09-02 - name/*.txt").select { |f| f.include?("P4")}.sort_by! {|s|  s[/(Dd+)-P4.txt/]}
puts contents

उपर्युक्त कोड के साथ मुझे मिल रहा है:

_1
_10
_100
_101
_102
.
.
.
_11
_111

जब मैं चाहता हूं कि यह है:

_1
_2
_3
_4
_5
.
.
.
_10
_11

आखिरकार, बीमार तब सरणी के माध्यम से लूप करना चाहता है ताकि वृद्धिशील मूल्य निरंतर (1 - 200) हो।

उत्तर:

जवाब के लिए 2 № 1
[
"W:/name/2014-09-02 - name/20140902-070343_1-P4.txt",
"W:/name/2014-09-02 - name/20140902-070343_10-P4.txt",
"W:/name/2014-09-02 - name/20140902-070343_2-P4.txt",
"W:/name/2014-09-02 - name/20140902-070343_200-P4.txt",
]
.sort_by{|s| s[/(?<=_)d+/].to_i}

परिणाम

[
"W:/name/2014-09-02 - name/20140902-070343_1-P4.txt",
"W:/name/2014-09-02 - name/20140902-070343_2-P4.txt",
"W:/name/2014-09-02 - name/20140902-070343_10-P4.txt",
"W:/name/2014-09-02 - name/20140902-070343_200-P4.txt"
]