2012-08-28 11 views
5

का उपयोग किए बिना प्रत्यय के साथ समाप्त होने वाली सभी फाइलें .bmp के साथ समाप्त होने वाले सभी को छोड़कर मैं सभी फ़ाइलों से मेल खाने की कोशिश कर रहा हूं।निगमन

कुछ बाधाओं के कारण मैं अस्वीकरण (?:,! :) और संदर्भ (\ 1, ...) का उपयोग नहीं कर सकता।

मैं एक अभिव्यक्ति कर दिया है और यह तार के अधिकांश के लिए काम करता है:

^\w+\.([^b].*|b|b[^m].*|bm|bm[^p].*|bmp.+)$ 

यह सब कुछ है कि .bmp साथ अंत नहीं है से मेल खाता है - test.txt, test.bmp.txt, आदि शामिल लेकिन निष्पक्ष रूप से, यह test.bi.bmp की अनुमति देता है।

रेगेक्स को सुधारने के तरीके पर कोई विचार है, तो यह सिर्फ से मेल नहीं करेगा .bmp के साथ समाप्त हो रहा है?

+0

है 'bmp' से पहले डॉट बनाने के लिए, उन बाध्यताओं का क्या हैं? –

+0

लक्ष्य मशीन पर रेगेक्स इंजन का उपयोग करके अन्य अनुप्रयोग हैं और कुछ कारणों से (जो मुझे पूरी तरह से अवगत नहीं है, लेकिन मुझे लगता है कि यह प्रदर्शन से संबंधित हो सकता है, कुछ या गति के साथ संगतता) रेगेक्स इंजन विशेष रूप से संकलित किया जाता है इसके बिना ... :-( – Avenger

उत्तर

5

क्यों नहीं:

^.*[^p]$|^.*[^m]p$|^.*[^b]mp$|^.*[^.]bmp$ 

?

http://regexr.com?31vg7

एक alternative^.*([^p]|[^m]p|[^b]mp|[^.]bmp)$ (कम) है।

+0

धन्यवाद, यह पूरी तरह से काम करता है (और बहुत कुछ मैंने जो लिखा उससे सुरुचिपूर्ण)। हालांकि एक आखिरी गलत फ़ाइल नाम है जो अभिव्यक्ति को पास करता है: test..bmp – Avenger

+0

@Daniel: पाठ के आखिरी इनपुट लाइन पर पाठ होने पर regexr के साथ regexr में एक बग है और इसके बाद रिक्त रेखा होती है। मुझे नहीं पता क्यों। उसके बाद एक नई लाइन खोलें और कुछ और टाइप करें, और देखें। – Benoit

+0

धन्यवाद। यह पूरी तरह से मेरी समस्या हल करता है और मैंने आपके जवाब से बहुत कुछ सीखा है! – Avenger

0

भी सुरुचिपूर्ण नहीं, लेकिन काम करता है:

^.*([^b][^m][^p]|b[^m][^p]|[^b]m[^p]|[^b][^m]p|bm[^p]|[^b]mp)$ 
+1

आप यह भी मान रहे हैं कि एक्सटेंशन हमेशा 3 अक्षर लंबे होते हैं। –

+0

मुझे नहीं लगता है कि, मुझे लगता है कि .bmp 3 अक्षरों का लंबा है। 3 से अधिक वर्ण वाले एक्सटेंशन भी मेल खाते होंगे। – Dmitry

+0

@Dmitry: उदाहरण के लिए test.notabmp? यह आपके रेगेक्स से मेल खाना चाहिए, लेकिन मुझे नहीं लगता कि यह है। –

1
/^.+\.([^b][^.]*|b|b[^m][^.]*|bm|bm[^p][^.]*|bmp[^.]+)$/ 

बस सुनिश्चित करें कि पिछले डॉट

जिज्ञासा से बाहर
+0

नहीं [^।] बस सबकुछ अस्वीकार करता है? – Avenger

+0

@ डैनियल: नहीं, रेगेक्स मेटाएक्टैक्टर्स एक चरित्र वर्ग के अंदर अपना विशेष अर्थ खो देते हैं। –

+0

मैंने सोचा कि यह केवल() में लागू है ... जानना अच्छा है! धन्यवाद। एक आखिरी समस्या - test..bmp पास हो जाता है। – Avenger