2013-08-15 6 views
6

मैंने सोचा कि मैं समझता हूं कि रेगेक्स ऑपरेटर कैसे काम करते हैं, लेकिन अब मैं वास्तव में उलझन में हूं।regex काम में (?!) ऑपरेटर कैसे करता है?

mail.wow.no-1.com 
mail.ololo.wow.com 

मैं पहली बार एक, नहीं दूसरे से मिलान करना चाहते: सरल उदाहरण में, मैं दो तार की है। और मैं regex (सरलीकृत संस्करण) लिख रहा हूँ इस तरह:

^mail\.(.*)(?!\.wow\.com)$ 

और जब मैं उन दोनों उदाहरणों पर जे एस विधि परीक्षा में चलाने के लिए, यह बस सच रिटर्न (उदात्त 2 regex खोज पर प्रकाश डाला में दोनों तार, कि साधन दोनों स्ट्रिंग मिलान)

मुझे पता है कि मैं रिवर्स रेगेक्स बना सकता हूं, जो दूसरे से मेल खाता है और इस पर निर्भर करता है, लेकिन मैं समझना चाहता हूं कि (?!) रेगेक्स कार्यों में और मैं क्या गलत कर रहा हूं।

धन्यवाद।

+4

http://www.regular-expressions.info/lookaround.html – Bergi

+1

मुझे आम तौर पर समझने के लिए नकारात्मक दिखने वाला आसान लगता है, लेकिन दुर्भाग्यवश यह जावास्क्रिप्ट है :) –

उत्तर

8

आप एक .* अग्रदर्शी अंदर की जरूरत है (और अग्रदर्शी बाहर .* के सामने ले जाने के):

^mail(?!.*\.wow\.com)\.(.*)$ 

अन्यथा, अपने अग्रदर्शी चेकों केवल स्ट्रिंग के अंत में। और जाहिर है, स्ट्रिंग के अंत में, .wow.com कभी भी नहीं हो सकता है। तुम बस के रूप में अच्छी तरह से अब पैटर्न की शुरुआत करने के लिए ले जाने के अग्रदर्शी सकता है:

^(?!.*\.wow\.com)mail\.(.*)$ 

Working demo.

यह पिछले संस्करण से थोड़ा कम कुशल है, लेकिन मैं पैटर्न थोड़ा आसान पाते हैं lookaheads को प्रभावित पढ़ने के लिए पूरी स्ट्रिंग पैटर्न की शुरुआत में सभी हैं।

+0

जानकारीपूर्ण और यह काम करता है, धन्यवाद! – kibin

+1

इसके अलावा, आपको जटिल नियमित अभिव्यक्तियों को समझने की कोशिश करते समय http://tinyurl.com/m8672z9 उपयोगी हो सकता है – ForbesLindesay

3

यह zero width assertion है। यह एक नकारात्मक नजर है।

यह क्या कहता है: इस स्थिति में - निम्नलिखित नहीं आ सकते हैं।

तो, उदाहरण के लिए (?!q) का अर्थ है, पत्र q अभी इस समय का पालन नहीं कर सकता है।

1

इस यूआरएल की एक परीक्षा यह है कि यह "मेल" की तलाश में है। तो जितना संभव हो सके उतने पात्र, फिर जांचें कि क्या (यानी स्ट्रिंग का अंत) और स्क्रीन के अंत में ".wow.com" मौजूद है।

^mail\.(.*)(?!\.wow\.com)$ 

इसके बजाय, यह पुन: व्यवस्थित इतना है कि यह जाँच करता है ".wow.com" के बाद आती है, तो "मेल।"।

^mail\.(?!.*\.wow\.com)(.*)$ 
3

क्या आप चाहते हैं

^mail\.(?!.*\.wow\.com$).*$ 

अन्य के रूप में कहा है, एक नकारात्मक शून्य चौड़ाई लुक-आगे दावा है (?!); यह किसी भी संख्या के पात्रों से मेल नहीं खाता है, लेकिन अगले पात्रों में देखता है, और यह सुनिश्चित करता है कि वे ब्रांड्स में मौजूद चीज़ों से मेल नहीं खाते हैं।

जावास्क्रिप्ट ने पर्ल से नियमित अभिव्यक्ति वाक्यविन्यास की प्रतिलिपि बनाई; इन्हें आमतौर पर पीसीआरई, या पर्ल-संगत नियमित अभिव्यक्तियों के रूप में जाना जाता है; हालांकि जावास्क्रिप्ट में केवल दिखने वाले हैं, वे इस बिंदु से भविष्य में देखते हैं; पर्ल भी नकारात्मक शून्य चौड़ाई लुक-पीछे, कि अपने मूल उदाहरण की तरह काम करेगा, और आसान इस मामले

# this is how it could be done in Perl 
^mail\..*(?<!\.wow\.com)$ 

हालांकि जावास्क्रिप्ट lookbehinds का समर्थन नहीं का विकल्प चुना है में है।

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