regexp

2009-06-05 13 views
23

पीसीआरई के साथ उलटा मैच, आप एक अभिव्यक्ति कैसे बना सकते हैं जो केवल तभी मेल खाएगा जब स्ट्रिंग नहीं मिली है।regexp

अगर मैं grep (जो मैं नहीं हूं) का उपयोग कर रहा था तो मैं -v विकल्प चाहता हूं।

एक और अधिक ठोस उदाहरण: मैं चाहता हूँ मेरी regexp iff स्ट्रिंग foo मैच के लिए नहीं स्ट्रिंग में है। तो यह bar से मेल खाता है लेकिन foobar नहीं होगा।

+0

आप किस भाषा का उपयोग कर रहे हैं? – innaM

+0

यह एक वेब सेवा में इनपुट है जो पीसीआरई का विज्ञापन करता है। तो भाषा वास्तव में पीसीआरई है। –

+1

डुप्लिकेट: http://stackoverflow.com/questions/850907/regular-expression-opposite –

उत्तर

41

ठीक है, मैंने जिस समाधान के साथ आया था, उसके आधार पर मैंने अपनी नियमित अभिव्यक्ति को परिष्कृत किया है (जो गलती से तारों से मेल खाता है जो परीक्षण 'से शुरू होता है)।

^((?!foo).)*$ 

यह नियमित अभिव्यक्ति केवल उन्हीं तारों से मेल खाती है जिनमें foo शामिल नहीं है। पहला लुकहेड 'foo' से शुरू होने वाली तारों को अस्वीकार कर देगा, और दूसरा यह सुनिश्चित करेगा कि स्ट्रिंग में कहीं भी foo नहीं मिला है।

1

यह वास्तव में लगभग एक डुप्लिकेट है। मुझे लगता है कि regex आप देख रहे हैं

(foo?!) है *

3

डैनियल जवाब के आधार पर, मुझे लगता है कि मैं कुछ है कि काम करता है मिल गया है:।

^(.(?!test))*$ 

कुंजी है आप स्ट्रिंग

+0

मुझे विश्वास नहीं है कि यह या तो काम करेगा; यह स्ट्रिंग 'टेस्ट' से मेल खाएगा। –

+0

शूट - आप सही हैं। यह मेरे वर्तमान परिदृश्य के लिए काफी अच्छा है क्योंकि किनारे का मामला नहीं मारा जाता है, लेकिन यह समस्या को पूरी तरह से हल नहीं करता है। –

+0

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

-1

बिल्ड एक अभिव्यक्ति से मेल खाता है, और प्रयोग के प्रत्येक वर्ण नकारात्मक दावा करने की जरूरत है कि! मैच() ... (तार्किक निषेध) शायद कैसे ग्रेप वैसे भी करता है यही कारण है कि ...

+0

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

-1

तुम भी ऐसा कर सकते हैं (अजगर में) re.split का उपयोग करके, और बंटवारे के आधार पर आपकी नियमित अभिव्यक्ति, इस प्रकार उन सभी हिस्सों को वापस लौटाती है जो रेगेक्स से मेल नहीं खाते हैं, splitting based on what doesn't match a regularexpression