रेगेक्स एक ऐसे सबरिंग से मेल खाता है, जो एक निश्चित दूसरे सबस्ट्रिंग के बाद नहीं है


115

मुझे एक रेगीक्स चाहिए जो मेल खाएगा blahfooblahलेकिन नहींblahfoobarblah

मैं चाहता हूं कि यह केवल foo और foo के आस-पास की सभी चीजों से मेल खाए, जब तक कि बार द्वारा इसका पालन न किया जाए।

मैंने इसका उपयोग करने की कोशिश की: foo.*(?<!bar)जो काफी करीब है, लेकिन यह मेल खाता है blahfoobarblah। कुछ भी मैच करने की जरूरत के पीछे नकारात्मक लुक और न सिर्फ बार।

मैं जिस विशिष्ट भाषा का उपयोग कर रहा हूं वह क्लूजुर है जो हुड के नीचे जावा रेगेक्स का उपयोग करता है।

संपादित करें: विशेष रूप से, मुझे भी इसे पास करने की आवश्यकता है blahfooblahfoobarblahलेकिन नहीं blahfoobarblahblah


1
क्या आपने फू का उपयोग करने की कोशिश की। * (? <? बार? *)।
थिबॉल्ट फालिज

जवाबों:


158

प्रयत्न:

/(?!.*bar)(?=.*foo)^(\w+)$/

टेस्ट:

blahfooblah            # pass
blahfooblahbarfail     # fail
somethingfoo           # pass
shouldbarfooshouldfail # fail
barfoofail             # fail

नियमित अभिव्यक्ति की व्याख्या

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    bar                      'bar'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    foo                      'foo'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

अन्य रेगेक्स

यदि आप केवल barइसके बाद सीधे बाहर करना चाहते हैं foo, तो आप उपयोग कर सकते हैं

/(?!.*foobar)(?=.*foo)^(\w+)$/

संपादित करें

आपने इसे विशिष्ट बनाने के लिए अपने प्रश्न का अपडेट दिया है।

/(?=.*foo(?!bar))^(\w+)$/

नए परीक्षण

fooshouldbarpass               # pass
butnotfoobarfail               # fail
fooshouldpassevenwithfoobar    # pass
nofuuhere                      # fail

नई व्याख्या

(?=.*foo(?!bar))सुनिश्चित किया fooजाता है, लेकिन इसका पालन नहीं किया जाता हैbar


यह बहुत करीब है, और बहुत अच्छा जवाब है। मुझे पता था कि मैं पर्याप्त विशिष्ट नहीं होगा। :( मुझे इसकी आवश्यकता है: "blahfoomeowwoof / foobar /" अकेला "फू" के कारण पास होने के लिए, लेकिन यह संभव नहीं है तो यह blahfoobarmeowwoof है।
Rayne

एक साइड सवाल के रूप में, कोई "बॉट" जैसी चीज़ से मेल खाने वाला कैसे होगा लेकिन "बोतल" नहीं?
Rayne

हाँ। मेरे पास अभी जो है उसका उपयोग कर सकता हूं, लेकिन यह आसान होगा अगर मैं सिर्फ बॉट से मेल खा सकता हूं लेकिन बोतलों से नहीं। मैं माफी चाहता हूँ। मैं regexes के साथ अनुभवहीन हूं, और मुझे डर है कि मैं धीरे-धीरे यह पता लगा रहा हूं कि मैं खुद क्या चाहता हूं। : पी
रेयॉन

1
@ रेने, यह वही सवाल है। आपके उपरोक्त उदाहरण में, आप मिलान करना चाहते थे fooलेकिन नहीं foobar। मिलान करने के लिए , botलेकिन bottersआप उपयोग नहीं करेंगे /(?=.*bot(?!ters))^(\w+)$/
माकक

खैर, मैं आम तौर पर पूरे शब्दों का लक्ष्य बना रहा था। जैसा कि मैंने कहा, मुझे भ्रम है कि मैं वास्तव में क्या चाहता हूं और वास्तव में क्या संभव है। इसे ऐसे करना काम करेगा। समय के लिए धन्यवाद। :)
रेने

55

किसी fooचीज़ से शुरू करने के लिए निम्नलिखित का मिलान करें bar, प्रयास करें

foo(?!bar)

नकारात्मक लुकअप के साथ आपका संस्करण प्रभावी रूप से " fooबाद में समाप्त न होने वाली चीज " से मेल खाता है bar.*मैचों के सभी barblah, और (?<!bar)दिखता है पर वापस lahऔर जांच करता है कि यह मेल नहीं खाता barहै, जो यह नहीं है, इसलिए पूरे पैटर्न से मेल खाता है।


तो मैंने इसे एक रेगेक्स के लिए आज़माया, जो स्ट्रिंग से मेल करने के लिए डिज़ाइन किया गया है "क्या आपने" इतनी देर तक इसे "कहने" का पालन नहीं किया। यह काम करता है जब "क्या आपने कहा" और "क्या आपने सोचा था" के बीच अंतर करना, उदाहरण के लिए, लेकिन सिर्फ "क्या आपने" खुद पर कब्जा नहीं किया है, और यह होना चाहिए। कोई सुझाव?
कालिख

2

इसके बजाय नकारात्मक रूप का उपयोग करें:

\s*(?!\w*(bar)\w*)\w*(foo)\w*\s*

इसने मेरे लिए काम किया, आशा है कि यह मदद करेगा। सौभाग्य!


सरल अभी तक प्रभावी रेगेक्स, जो दोहराए जाने वाले तार ("फूफो") को छोड़कर भी काम करता है। उत्तम!
जोनास बिस्ट्रॉम

1

आपने एक टिप्‍पणी लिखी है, जिसमें लिखा है कि आप इस तरह से काम करें कि पूरे स्ट्रिंग के बजाए एक स्ट्रिंग में सभी शब्दों का मिलान करें।

इस सब पर टिप्पणी करने के बजाय, मैं इसे एक नए उत्तर के रूप में पोस्ट कर रहा हूं।

न्यू रेगेक्स

/(?=\w*foo(?!bar))(\w+)/

नमूना पाठ

फोवोइथबार फुएवेन्विथोफोबार नॉटफ़ोबार फ़ॉउथरे नॉटोफ़ारहेयर बटफ़ोइसोखेरेबार नॉटफ़ोबारेयर एंडोफ़ु नूफ़ू

माचिस

foowithbar fooevenwithfoobar foohere butfooisokherebar needfoo


0

आपके विशिष्ट मिलान अनुरोध द्वारा मिलान किया जा सकता है:

\w+foo(?!bar)\w+

यह मैच होगा blahfooblahfoobarblahलेकिन नहीं blahfoobarblahblah

के अपने regex के साथ समस्या foo.*(?<!bar)के .*बाद है foo। यह किसी भी वर्ण के साथ मेल खाता है जिसमें वर्ण शामिल हैं bar

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.