2010-03-18 5 views
19

क्या फ़ाइल का विस्तार खोजने के लिए पर्ल में नियमित अभिव्यक्ति है? उदाहरण के लिए, यदि मेरे पास "test.exe" है, तो मुझे ".exe" कैसे मिलेगा?क्या फ़ाइल का विस्तार खोजने के लिए पर्ल में नियमित अभिव्यक्ति है?

+0

@ Ether..I इसकी एक बड़ा सवाल है। मैं पर्ल में एक दशक से अधिक समय तक चालू और बंद हूं और कई बार जब मैं कुछ त्वरित संदर्भ चाहता हूं। – Anshu

उत्तर

38
my $file = "test.exe"; 

# Match a dot, followed by any number of non-dots until the 
# end of the line. 
my ($ext) = $file =~ /(\.[^.]+)$/; 

print "$ext\n"; 
4
\.[^\.]*$ 

यह आपको स्ट्रिंग के अंत तक अंतिम बिंदु (डॉट सहित) के बाद सब कुछ देगा।

3

आप File::Basename इस्तेमाल कर सकते हैं एक मनमाना फ़ाइल एक्सटेंशन को निकालने के लिए:

use strict; 
use warnings; 
use File::Basename; 
my $ext = (fileparse("/foo/bar/baz.exe", qr/\.[^.]*/))[2]; 
print "$ext"; 
12

उपयोग फ़ाइल :: बेसनाम

use File::Basename; 
    ($name,$path,$suffix) = fileparse("test.exe.bat",qr"\..[^.]*$"); 
    print $suffix; 
+2

मैंने कभी सोचा नहीं है कि फ़ाइल :: बेसनाम इस नौकरी के लिए कोई अच्छा था क्योंकि आपको उस पैटर्न को आपूर्ति करना है जिसे आप मैच ऑपरेटर के साथ एक ही काम करने के लिए इस्तेमाल कर सकते थे। –

+2

यदि यह विस्तार प्राप्त करने के लिए है, तो सामान्य रेगेक्स पर्याप्त होगा। लेकिन फ़ाइल :: बेसनाम भी शेष पथ को पार करता है। यदि ओपी को विस्तार की आवश्यकता के अलावा उन्हें प्राप्त करने की आवश्यकता है, तो फ़ाइल :: बेसनाम आसान काम में आता है। – ghostdog74

+0

चेतावनी: मेरे पास फाइलें थीं जिन्हें उपयोगकर्ता नाम 'filename..doc' के रूप में नामित किया गया था और उपरोक्त प्रत्यय के लिए regep एक्सटेंशन के रूप में '..doc' वापस कर देगा। इस दिशा में जाने पर @toolic उत्तर (या फ़ाइल के लिए पर्ल डॉक्स: बेसनाम) में से एक को पसंद करें। –

3

यहाँ यह एक regex पैटर्न n-स्तरीय एक्सटेंशन फ़ाइल मैच के लिए है (उदाहरण के लिए .tar.gz या .tar.bz2)।

((\.[^.\s]+)+)$ 

उदाहरण:

#!/usr/bin/perl 

my $file1 = "filename.tar.gz.bak"; 
my ($ext1) = $file1 =~ /((\.[^.\s]+)+)$/; 

my $file2 = "filename.exe"; 
my ($ext2) = $file2 =~ /((\.[^.\s]+)+)$/; 

my $file3 = "filename. exe"; 
my ($ext3) = $file3 =~ /((\.[^.\s]+)+)$/; 

my $file4 = "filename.............doc"; 
my ($ext4) = $file4 =~ /((\.[^.\s]+)+)$/; 

print "1) $ext1\n"; # prints "1) .tar.gz.bak" 
print "2) $ext2\n"; # prints "2) .exe" 
print "3) $ext3\n"; # prints "3) " 
print "4) $ext4\n"; # prints "4) .doc" 
संबंधित मुद्दे