2009-03-09 11 views
12

मैं सिर्फ फ़ाइल नाम regex का उपयोग कर प्राप्त करना चाहते हैं, तो मैं जैसेरेगेक्स: एक शॉट में एक्सटेंशन के बिना फ़ाइल नाम प्राप्त करें?

([^\.]*) 

जो पाठ्यक्रम काम के फ़ाइल नाम एक एक्सटेंशन है ही अगर साधारण चीजें कोशिश कर रहा हूँ। लेकिन अगर यह adfadsfads.blah.txt है तो मुझे बस adfadsfads.blah चाहिए। मैं regex के साथ यह कैसे कर सकता हूँ?

डेविड के सवाल के संबंध में, 'आप रेगेक्स का उपयोग क्यों करेंगे', इसका जवाब है, 'मज़ा के लिए।' वास्तव में, कोड मैं उपयोग कर रहा हूँ सरल

length_of_ext = File.extname(filename).length 
filename = filename[0,(filename.length-length_of_ext)] 

है, लेकिन मैं regex जब भी संभव हो, क्योंकि यह हमेशा गीक कॉकटेल पार्टियों में आता है जानने के लिए पसंद करते हैं।

+0

डैनियल, इस तरह के मामले में मैं आपको RegexBuddy जैसे टूल खरीदने की सलाह दूंगा। यदि आपके पास ऐसा टूल है तो रेगेक्स के साथ खेलना अधिक मजेदार है। आप इस तरह के एक उपकरण में नियमित अभिव्यक्तियों को भी डीबग कर सकते हैं। वास्तव में एक अनुशंसा करते हैं। –

+0

धन्यवाद डेविड। मैं रेगेक्स कोच का उपयोग करता हूं, जो वास्तव में अच्छी तरह से करता है। –

उत्तर

33

इस प्रयास करें:

(.+?)(\.[^.]*$|$) 

हो जाएगा ताकि:

  • कब्जा फ़ाइल नाम है कि एक बिंदु के साथ शुरू करते हैं (उदाहरण के लिए ".logs" ".logs" नाम की एक फ़ाइल, नहीं एक है फ़ाइल एक्सटेंशन), ​​जो यूनिक्स में आम है।
  • सबकुछ प्राप्त करता है लेकिन अंतिम बिंदु: "foo.bar.jpeg" आपको "foo.bar" प्राप्त करता है।
  • कोई डॉट के साथ फ़ाइलों को संभालता है: "गुप्त-पत्र" आपको "गुप्त-पत्र" प्राप्त करता है।

नोट: के रूप में टिप्पणीकार j_random_hacker सुझाव दिया, इस के रूप में विज्ञापित करता है, लेकिन आप पठनीयता प्रयोजनों के लिए एक लंगर के साथ चीजों को पूर्व में होना कर सकते हैं।

+1

इस पर एक अच्छी व्याख्या है http://www.movingtofreedom.org/2008/04/01/regex-match-filename-base-and-extension/ – bernie

+0

स्टार एक प्लस होना चाहिए, मुझे लगता है - यद्यपि यह स्पष्ट नहीं है कि 'लॉग' नामक फ़ाइल क्या है। वापस आना चाहिए –

+1

हालांकि यह विज्ञापन के रूप में काम करता है, क्या मैं सिर्फ पठनीयता के लिए "^" एंकर को तैयार करने का सुझाव दे सकता हूं? एंकर के बिना, इस रेगेक्स को पहली बार देखने वाले प्रोग्रामर को यह सत्यापित करने के लिए एक विस्तृत विश्लेषण करने की आवश्यकता होती है कि लौटा हुआ मिलान स्ट्रिंग की शुरुआत में हमेशा शुरू होता है। –

4

सब कुछ एक बिंदु एक या अधिक वर्ण के बाद कि एक बिंदु नहीं है के बाद, अंत के स्ट्रिंग हो:

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

सब कुछ पहले-अंतिम डॉट आसान के लिए वर्गीकृत किया जाता है पुनः प्राप्ति।

आप 100% यकीन है कि हर फ़ाइल ही विस्तार होगा नहीं हैं, तो कोशिश:

(.+?)(\.[^\.]+$|$) 
+0

यह किसी फ़ाइल नाम से मेल नहीं खाता है जिसमें कोई एक्सटेंशन नहीं है –

3

तरीके के बारे में 2 अंत के लिए एक कब्जा और फ़ाइल नाम के लिए एक।

उदाहरण के लिए।

(.+?)(?:\.[^\.]*$|$) 
+0

यह ठीक है, लेकिन जब से मैं फ़ाइल नाम निकाल रहा हूं, परेशान क्यों? मुझे एक रेगेक्स चाहिए जो सिर्फ फाइलनाम प्राप्त करे। –

+0

यह भी कोई फ़ाइल नाम से मेल नहीं खाता है जिसमें कोई एक्सटेंशन नहीं है। –

0

ठीक है, मुझे यकीन नहीं है कि मैं इसके लिए नियमित अभिव्यक्ति का उपयोग क्यों करूंगा। अगर मुझे उदाहरण के लिए पता है कि स्ट्रिंग एक पूर्ण फ़ाइलपैथ है, तो मैं फ़ाइल नाम प्राप्त करने के लिए एक और एपीआई का उपयोग करूंगा। नियमित अभिव्यक्ति बहुत शक्तिशाली हैं लेकिन साथ ही काफी जटिल (आपने अभी साबित कर दिया है कि इस तरह के एक सरल रेगेक्स को कैसे बनाना है)। किसी ने कहा: आपको एक समस्या थी जिसे आपने नियमित अभिव्यक्तियों का उपयोग करके हल करने का निर्णय लिया था। अब आपके पास दो समस्याएं हैं।

फिर से सोचें। यदि आप उदाहरण के लिए .NET प्लेटफॉर्म पर हैं, तो System.IO.Path कक्षा पर एक नज़र डालें।

+0

अच्छा, यह बहुत मजेदार नहीं है, है ना? वैसे भी, आपके उत्तर में प्रश्न समायोजित करें, कृपया ऊपर देखें। धन्यवाद। –

0
^(.*)\\(.*)(\..*)$ 
  1. साथ विस्तार एक .

उदाहरण विस्तार

  • बिना बिना पिछले \
  • फ़ाइल पथ हो जाता है:

    c:\1\2\3\Books.accdb
    इस पाठ के लिए

    ^\s*[^\.\W]+$ 
    

    :

    फ़ाइल नाम में एक से अधिक . का समर्थन नहीं करता

  • 0

    मैं साधारण खोज के लिए इस पद्धति का इस्तेमाल किया फ़ाइल पथ में समर्थन . करता

    file.ext 
        fileext 
    
        file.ext.ext 
    file.ext 
    fileext 
    

    यह दूसरी और आखिरी पंक्तियों में fileext पाता है।
    मैंने इसे किसी फ़ोल्डर के टेक्स्ट ट्री व्यू (इंडेंट्स के रूप में रिक्त स्थान के साथ) में लागू किया।

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