रेगेक्स: सब कुछ लेकिन विशिष्ट पैटर्न से मेल खाता है


310

मुझे सब कुछ मैच करने में सक्षम रेगीक्स की आवश्यकता है लेकिन एक विशिष्ट पैटर्न के साथ शुरू होने वाली एक स्ट्रिंग (विशेष रूप से index.phpऔर इस प्रकार, जैसे index.php?id=2342343)


और आप किस विशिष्ट पैटर्न से मेल नहीं खाना चाहते हैं?
डोमिनिक रॉगर

2
क्या कोई कारण है कि आप अपने पैटर्न के खिलाफ मैच नहीं कर सकते हैं और कुछ ऐसा नहीं करते हैं यदि स्ट्रिंग मेल खाती है?
थॉमस ओवेन्स


@ThomasOwens: यह निर्भर करता है। यह निर्भर करता है कि अभिव्यक्ति के किस हिस्से को नकार दिया जाएगा। यदि पूरी अभिव्यक्ति को नकारना है, तो आपको एक बिंदु मिला। उदाहरण के लिए, यदि आप "कोड करना चाहते हैं" अगर स्ट्रिंग में विकल्प के रूप में 'ब्रूस' नहीं है, तो कुछ करें ", आप स्पष्ट रूप से / ब्रूस / का उपयोग करेंगे, और यदि रेगेक्स के बाहर, तो स्टेटमेंट को नकार दें। । लेकिन यह हो सकता है कि आप कुछ उपसंचाई को नकारना चाहते हैं। कहते हैं, आप फ़र्स्टनेम lastname जैसी किसी चीज़ की तलाश में हैं, जहाँ Firstname ब्रूस है, और lastname XYZ को छोड़कर सब कुछ है, जहाँ XYZ ब्रूस नामक कुछ सेलिब्रिटी का अंतिम नाम है।
मैथेडिनक्लाउड्स

जवाबों:


250

Regexp विशेषज्ञ नहीं है, लेकिन मुझे लगता है कि आप शुरू से ही नकारात्मक लुकहेड का उपयोग कर सकते हैं, उदाहरण के ^(?!foo).*$साथ शुरू होने वाले कुछ से मेल नहीं खाना चाहिए foo


7
देख-रेख सक्षम करने के लिए grep उपयोग -P के साथ।
सेप्पो एनारवी

यदि "फू" या "बार" से मेल न
खाना

15
यह उत्तर गलत है, एक त्वरित परीक्षण से पता चलता है कि। मुझे लगता है कि आपका क्या मतलब है ^((?!foo).)*$( stackoverflow.com/a/406408/3964381 )
गिलाद मयानी

4
क्या आप अपने द्वारा इस्तेमाल किए गए प्रतीकों की व्याख्या कर सकते हैं और आपने उनका उपयोग क्यों किया?
रोटिमी-बेस्ट

339

रेगेक्स: मैच सब कुछ लेकिन :

  • एक विशिष्ट पैटर्न के साथ शुरू होने वाली एक स्ट्रिंग (जैसे कोई भी - खाली, बहुत - स्ट्रिंग के साथ शुरू नहीं foo):
  • एक विशिष्ट पैटर्न के साथ समाप्त होने वाली एक स्ट्रिंग (कहते हैं, world.अंत में नहीं):
  • एक स्ट्रिंग जिसमें विशिष्ट पाठ होता है (कहते हैं, स्ट्रिंग से मेल नहीं खाता foo) (कोई POSIX अनुरूप पेटरन, क्षमा करें):
  • एक स्ट्रिंग जिसमें विशिष्ट वर्ण होता है (कहते हैं, एक स्ट्रिंग के |प्रतीक से मेल खाने से बचें ):
  • एक स्ट्रिंग के बराबर कुछ स्ट्रिंग (जैसे कि, नहीं के बराबर foo):
  • पात्रों का एक क्रम :
    • PCRE (किसी भी पाठ से मिलान करें cat): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/iया/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
    • लुकरॉइड की अनुमति देने वाले अन्य इंजन: (cat)|[^c]*(?:c(?!at)[^c]*)*(या (?s)(cat)|(?:(?!cat).)*, या (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*) और फिर भाषा के साथ जांच का अर्थ है: यदि समूह 1 का मिलान हुआ है, तो यह वह नहीं है जो हमें चाहिए, अन्यथा, खाली नहीं होने पर मैच मान को पकड़ो
  • एक निश्चित एकल वर्ण या वर्णों का समूह :

डेमो नोट : न्यूलाइन \nका उपयोग डेमो में नकारात्मक चरित्र वर्ग के अंदर किया जाता है ताकि पड़ोसी लाइन (एस) के लिए अतिप्रवाह से बचा जा सके। व्यक्तिगत तारों का परीक्षण करते समय वे आवश्यक नहीं होते हैं।

एंकर ध्यान दें : कई भाषाओं में, \Aस्ट्रिंग के बहुत ही अंत को परिभाषित करने के लिए , और स्ट्रिंग के अस्पष्ट शुरुआत को परिभाषित करने के लिए उपयोग करें \z(पायथन में, यह \Zजावास्क्रिप्ट $में ठीक है)।

डॉट नोट : कई स्वादों में (लेकिन POSIX, TRE, TCL नहीं) .किसी भी चार से मेल खाता है लेकिन एक नई लाइन चार से मेल खाता है । सुनिश्चित करें कि आप एक नई तिथि सहित किसी भी चार्ट से मेल खाने के लिए एक संबंधित DOTALL संशोधक ( /sPCRE / Boost / .NET / Python / Java में और /mरूबी में) का उपयोग .करें।

बैकस्लैश नोट : उन भाषाओं में जहां आपको सी स्ट्रिंग्स के साथ पैटर्न की घोषणा करनी होती है ताकि बच अनुक्रमों (जैसे \nएक नई रेखा के लिए) की अनुमति हो, आपको विशेष वर्णों से बचने वाले बैकस्लैशों को दोगुना करने की आवश्यकता होती है ताकि इंजन उन्हें शाब्दिक पात्रों के रूप में व्यवहार कर सके (जैसे जावा में, अक्षर world\.होगा) के रूप में घोषित "world\\.", या एक चरित्र वर्ग का उपयोग करें:) "world[.]"। कच्चे स्ट्रिंग शाब्दिक (पायथन r'\bworld\b'), सी # @"world\."वर्बटीम स्ट्रिंग शाब्दिक , या स्लेश स्ट्रिंग्स / रेगेक्स शाब्दिक संकेतन का उपयोग करें /world\./


महान लिखना! उदाहरण के साथ, "एक स्ट्रिंग (कुछ स्ट्रिंग के बराबर नहीं)" के मामले में ^(?!foo$), ऐसा क्यों है कि अभिव्यक्ति का काम करने के लिए डॉलर के संकेत को कोष्ठक के भीतर होना चाहिए? मैं ^(?!foo)$समान परिणाम देने की उम्मीद कर रहा था , लेकिन ऐसा नहीं है।
हम्फ्रीज

3
@GrantHumphries: जब $एंकर लुकहेड के अंदर होता है, तो यह शर्त का हिस्सा होता है, उस शून्य-चौड़ाई के दावे का हिस्सा । यदि यह बाहर की तरह था ^(?!foo)$, तो यह स्ट्रिंग के शुरू होने के बाद स्ट्रिंग के अंत की आवश्यकता वाले उपभोग पैटर्न का हिस्सा होगा , जिससे नकारात्मक रूपांतर अप्रासंगिक हो जाएगा क्योंकि यह हमेशा सही होगा (स्ट्रिंग के अंत के बाद कोई पाठ नहीं हो सकता है) अकेले चलो foo)। तो, ^(?!foo$)एक स्ट्रिंग की शुरुआत होती है fooजो स्ट्रिंग अंत के साथ पीछा नहीं किया जाता है। ^(?!foo)$एक खाली स्ट्रिंग से मेल खाता है।
विकटोरिया स्ट्रीब्यूव

@ robots.txt कृपया इन टिप्पणियों को हटा दें। आप एक XY प्रश्न पूछ रहे हैं। चरित्र कक्षाएं एकल वर्णों से मेल खाने के लिए होती हैं, उनके साथ वर्णों के अनुक्रम को परिभाषित करने का कोई तरीका नहीं है। आप शायद सिर्फ एक स्ट्रिंग की शुरुआत और की पहली आवृत्ति के बीच सबस्ट्रिंग खोजना चाहिए cotया lan, और जैसे मैच निकालने के लिए, regex.replace(myString, "^.*?(?:cot|lan)\s*", "")
विकिटोर स्ट्राइब्यू जुवे

प्रिय विकट। आपने मेरा प्रश्न बंद कर दिया है लेकिन आपका जुड़ा हुआ उत्तर विफल है। मैंने अपना प्रश्न stackoverflow.com/questions/60004380/…
MonsterMMORPG

उदाहरण के लिए अपने लिंक किए गए इस सवाल का जवाब इस उदाहरण को विफल रहता है "संकुल ing <! - और वेब पेज <! - asdasasdas -> संपादक अब का उपयोग -> Lorem Ipsum"
MonsterMMORPG

259

आप ^एक चरित्र की शुरुआत में कुछ भी लेकिन उन पात्रों से मेल खाने के लिए सेट कर सकते हैं।

[^=]*

सब कुछ मेल खाएगा लेकिन =


55
यह सच है, लेकिन यह केवल एक समय में एक चरित्र को संसाधित करता है। यदि आप दो या दो से अधिक वर्णों के अनुक्रम को बाहर करना चाहते हैं, तो आपको नकारात्मक रूपांतर का उपयोग करना होगा, जैसा कि अन्य उत्तरदाताओं ने कहा है।
एलन मूर

सही समाधान tu किसी भी अवांछनीय चरित्र को हटा दें, लेकिन पैटर्न में। धन्यवाद
Sirmyself

@Alan, "... आपको एक नकारात्मक रूप का उपयोग करना है ..." गलत है, लेकिन हमें आप पर बहुत मुश्किल नहीं होना चाहिए क्योंकि विकटोर ने अपना उत्तर पोस्ट नहीं किया है - जो दिखाता है कि क्यों - 2016 तक
कैरी स्वेवेलैंड


6

अजगर में:

>>> import re
>>> p='^(?!index\.php\?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
<_sre.SRE_Match object at 0xb7d65fa8>

3
यह "index_php" या "index # php" को अस्वीकार कर देगा।

1

मैं करने के लिए एक regex में सक्षम की जरूरत है सब कुछ से मेल खाते हैं लेकिन सिवाय एक के साथ शुरू स्ट्रिंग index.php एक विशिष्ट पैटर्न (विशेष रूप से index.php और क्या इस प्रकार है, index.php की तरह? Id = 2,342,343)

विधि Exec का उपयोग करें

    let match,
        arr = [],
        myRe = /([\s\S]+?)(?:index\.php\?id.+)/g;

    var str = 'http://regular-viragenia/index.php?id=2342343';

    while ((match = myRe.exec(str)) != null) {
         arr.push(match[1]);
    } 
    
    console.log(arr);

var myRe = /([\s\S]+?)(?:index\.php\?id=.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
var matches_array = myRe.exec(str);
console.log(matches_array[1]);

या अन्य सामग्री

let match,
            arr = [],
            myRe = /index.php\?id=((?:(?!index)[\s\S])*)/g;

        var str = 'http://regular-viragenia/index.php?id=2342343index.php?id=111index.php?id=222';

        while ((match = myRe.exec(str)) != null) {
             arr.push(match[1]);
        } 

        console.log(arr);


-13

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

// In PHP
0 !== strpos($string, 'index.php')

11
ओपी ने विशेष रूप से एक रेगेक्स का अनुरोध किया ... मुझे यकीन नहीं है कि यह मदद करता है! (वह grepकमांड-लाइन पर उपयोग कर सकते हैं , उदाहरण के लिए, या पर्ल / पायथन / किसी भी अन्य भाषा, या एक पाठ संपादक, आदि में "हर पंक्ति के लिए इस regex निष्पादित करें ...)
rinogo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.