2013-08-14 8 views
10

मेरे पास नीचे दिए गए पैटर्न को बाहर करने के लिए नीचे दिया गया है।RegEx - मिलान किए गए पैटर्न को छोड़ दें

make it cheaper 
make it cheapere 
makeitcheaper.com.au 
makeitcheaper 
making it cheaper 
www.make it cheaper 
ww.make it cheaper.com 

मैंने इनमें से किसी से मेल खाने के लिए एक रेगेक्स बनाया है। हालांकि, मैं इनके अलावा अन्य सभी चीजें प्राप्त करना चाहता हूं। मुझे यकीन नहीं है कि मैंने इस रेगेक्स को कैसे बनाया है।

mak(e|ing) ?it ?cheaper 

उपरोक्त पैटर्न सूचीबद्ध सभी तारों से मेल खाता है। अब मैं इसे सबकुछ से मेल खाना चाहता हूं। मैं यह कैसे करुं?

खोज से, ऐसा लगता है कि मुझे नकारात्मक लुकहेड/लुक बैक की तरह कुछ चाहिए। लेकिन, मुझे वास्तव में यह नहीं मिलता है। क्या कोई मुझे सही दिशा दिखा सकता है?

उत्तर

17

तुम बस इतना की तरह एक नकारात्मक लुक-आगे में रख सकते हैं:

(?!mak(e|ing) ?it ?cheaper) 

बस ऐसे ही, हालांकि बाद से काम करने के लिए, यदि आप एक matches कर नहीं जा रहा है, ऐसा नहीं होगा मैच के बाद से, आप वास्तव में कुछ भी देख रहे हैं, और यदि आप find करते हैं, तो यह कई बार मिल जाएगा, क्योंकि आप स्ट्रिंग में बहुत से स्थानों से शुरू कर सकते हैं जहां अगले अक्षर नहीं हैं उपरोक्त मैच नहीं है।

  1. आप सभी स्ट्रिंग बिल्कुल उन में से एक (यानी "यह cheaperblahblah बनाने" कर रहे हैं बाहर करने के लिए करना चाहते हैं:

    इसे ठीक करने के लिए आप क्या करना चाहते क्या पर निर्भर करता है, हम 2 विकल्प हैं शामिल नहीं है), स्ट्रिंग की शुरुआत (^) और अंत ($) के लिए जाँच:

    ^(?!mak(e|ing) ?it ?cheaper$).* 
    

    .* (शून्य या अधिक जंगली कार्ड) वास्तविक मिलान लेने जगह है। पहले चरित्र से नकारात्मक रूप से आगे की जांच।

  2. आप सभी स्ट्रिंग्स उन लोगों में से एक युक्त बाहर करना चाहते हैं, तो आप सुनिश्चित कर सकते लुक-आगे हर चरित्र से पहले दर्ज नहीं होता है हम से मेल खाते हैं:

    ^((?!mak(e|ing) ?it ?cheaper).)*$ 
    

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

    ^(?!.*mak(e|ing) ?it ?cheaper).* 
    
^ और $, या तो एक find या एक matches कर matches के मामले में, हालांकि इसके बाद के संस्करण (दोनों में से किसी के लिए काम करेंगे की वजह से

, ^ वैकल्पिक है और के मामले में, find, .* लुक-आगे के बाहर वैकल्पिक है)।


1: हालांकि वे नहीं कहा जा सकता है कि, कई भाषाओं matches और find regex के साथ के बराबर कार्य हैं।


उपर्युक्त इस प्रश्न का कड़ाई से-रेगेक्स उत्तर है।

मूल रेगेक्स (mak(e|ing) ?it ?cheaper) पर चिपकने के लिए एक बेहतर तरीका हो सकता है और देखें कि आप सीधे उपयोग किए जा रहे टूल या भाषा के साथ सीधे मैचों को अस्वीकार कर सकते हैं या नहीं।

जावा में, उदाहरण के लिए, इसमें if (!string.matches(originalRegex)) (! नोट करें, जो लौटा हुआ बूलियन को अस्वीकार करता है) if (string.matches(negLookRegex)) के बजाय शामिल होगा।

6

नकारात्मक दिखने वाला, मेरा मानना ​​है कि आप जो खोज रहे हैं। हो सकता है कि कोशिश:

(?!.*mak(e|ing) ?it ?cheaper) 

और शायद थोड़ा और अधिक लचीला:

(?!.*mak(e|ing) *it *cheaper) 

बस मामले में एक से अधिक जगह नहीं कर रहे हैं।

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