निर्दिष्ट स्ट्रिंग्स को छोड़कर सभी चीजों का मिलान करें


118

मुझे पता है कि निम्नलिखित रेगेक्स "लाल", "ग्रीन", या "ब्लू" से मेल खाएगा।

red|green|blue

वहाँ कई निर्दिष्ट तार को छोड़कर यह सब कुछ मैच बनाने का एक सीधा तरीका है ?


1
नियमित अभिव्यक्ति के सभी स्वाद ऐसा नहीं कर सकते। आप किस माहौल में काम कर रहे हैं? जावा? पर्ल? नेट? कुछ C / C ++ regex लाइब्रेरी? एक RDBMS
FrustratedWithFormsDesigner

8
आप यह नहीं कहते कि आप इसके लिए क्या चाहते हैं, लेकिन आप "मैच" ऑपरेशन की भावना को उल्टा कर सकते हैं। यदि आप गैर-मिलान वाले हिस्सों पर निष्कर्षण करने की कोशिश कर रहे हैं, तो यह आपकी मदद नहीं करेगा, लेकिन यह जांचने के लिए कि क्या बाहर रखा स्ट्रिंग मौजूद नहीं है, यह काम करेगा: if (!s.match(/red|green|blue/)) ... नोट: मुझे पता है कि ओपी भाषा / रूपरेखा को निर्दिष्ट नहीं करता है, इसलिए पूर्ववर्ती को एक सामान्य उदाहरण माना जाना चाहिए, न कि एक प्रिस्क्रिप्शन।
tvanfosson

जवाबों:


153

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

^(?!.*(red|green|blue))

इसके अलावा, मान लीजिए कि आप "इंजन" शब्द से युक्त लाइनें चाहते हैं, लेकिन उन रंगों में से कोई भी बिना:

^(?!.*(red|green|blue)).*engine

आप सोच सकते हैं कि आप .*नियमित अभिव्यक्ति के प्रमुख के लिए कारक हो सकते हैं :

^.*(?!red|green|blue)engine     # Does not work

पर तुम नहीं कर सकते। आपके पास .*काम करने के लिए इसके दोनों उदाहरण हैं।


48

भाषा पर निर्भर करता है, लेकिन आम तौर पर नकारात्मक-दावे हैं जो आप इसमें डाल सकते हैं:

(?!red|green|blue)

(सिंटैक्स फिक्स के लिए धन्यवाद, उपरोक्त वैध जावा और पर्ल, YMMV है)


2
@ केक, पूरा जवाब मेरा और तुम्हारा का मेल है। यदि आप उन्हें एक साथ मिलाना चाहते हैं, तो मैं उन्हें हटा दूंगा।
वेन कॉनराड

13
यह उत्तर बहुत अधिक उपयोगी होगा, आपको इसे थोड़ा समझाया जाएगा। उदाहरण के लिए: "क्या करें?" तथा "!" क्या मतलब है? आपको कैप्चर समूहों की आवश्यकता क्यों है?
Lii

यह मान्य पायथन भी है।
जो मोर्निन

बस डेल्फी regEx पुस्तकालय के साथ इसका इस्तेमाल किया और यह केवल इस तरह से काम करता है: ^ (? | लाल | हरा | नीला)। यह regex101.com पर परीक्षण के लिए भी सही है । तो क्या उपर्युक्त एक टाइपो गायब है ^ या क्या यह वास्तव में जावा / पर्ल / पायथन में काम करता है ..?
पीटर

32

मैचिंग एनीथिंग बट गिविंग स्ट्रिंग्स

यदि आप पूरी स्ट्रिंग का मिलान करना चाहते हैं, जहां आप सब कुछ मैच करना चाहते हैं, लेकिन कुछ तार आप इस तरह से कर सकते हैं:

^(?!(red|green|blue)$).*$

यह कहता है, स्ट्रिंग की शुरुआत से मैच शुरू करें जहां यह लाल, हरे, या नीले रंग के साथ शुरू और समाप्त नहीं हो सकता है और स्ट्रिंग के अंत में कुछ और मैच कर सकता है।

आप इसे यहाँ आज़मा सकते हैं: https://regex101.com/r/rMbYHz/2

ध्यान दें कि यह केवल रेगेक्स इंजन के साथ काम करता है जो नकारात्मक लुकहेड का समर्थन करता है ।


23

आपको नकारात्मक लुकहेड की आवश्यकता नहीं है। काम करने का उदाहरण है:

/([\s\S]*?)(red|green|blue|)/g

विवरण:

  • [\s\S] - किसी भी चरित्र से मेल खाते हैं
  • * - पिछले समूह से 0 से असीमित तक मैच
  • ? - जितना संभव हो उतना कम मैच करें
  • (red|green|blue|) - इस शब्द में से एक या कुछ भी मैच
  • g - रिपीट पैटर्न

उदाहरण:

whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite

होगा:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

झसे आज़माओ: regex101.com


4
आप एक डॉट के लिए [\ s \ S] स्वैप करके चरण संख्या को बहुत कम कर सकते हैं। मैं बहुत उलझन में था कि प्रतीत होता है कि क्यों हर दूसरा उदाहरण प्रत्येक शब्द को व्यक्तिगत रूप से कैप्चर करता है। यह तरीका थोड़ा और अधिक रेगीक्स कदम है लेकिन इसके लिए बहुत कम पोस्ट-प्रोसेसिंग की आवश्यकता होती है।
ज़तरोनियम

3
लेकिन यह मिलान (पाठ सत्यापन) नहीं करता है, यह सिर्फ प्रतिस्थापन के दौरान निर्दिष्ट पाठ को हटा देता है।
मारेक आर

यह समाधान ज्ञात शब्दों के बाद पाठ के अंतिम भाग को आउटपुट नहीं करेगा। तो, गति की तुलना करने की कोई आवश्यकता नहीं है, यह सिर्फ गलत है।
विकटोरिया Stribiżew

@ WiktorStribiżew तय।
hlcs

10

मेरे पास एक ही सवाल था, प्रस्तावित समाधान लगभग काम कर रहे थे लेकिन उनके पास कुछ मुद्दा था। अंत में मैंने जो रेगेक्स का उपयोग किया है वह है:

^(?!red|green|blue).*

मैंने जावास्क्रिप्ट और .NET में इसका परीक्षण किया।

। * इस तरह के नकारात्मक लुकहेड के अंदर नहीं रखा जाना चाहिए: ^ (!?! * लाल | हरा | नीला) दूसरा "


3

किसी भी पाठ से मेल खाते हुए, लेकिन पैटर्न से मेल खाने वालों को आमतौर पर रेगेक्स पैटर्न के साथ स्ट्रिंग को विभाजित करने के साथ हासिल किया जाता है ।

उदाहरण :

  • - Regex.Split(text, @"red|green|blue")या, खाली मूल्यों से छुटकारा पाने के लिए, Regex.Split(text, @"red|green|blue").Where(x => !string.IsNullOrEmpty(x))( डेमो देखें )
  • - Regex.Split(text, "red|green|blue")या, खाली आइटम निकालने के लिए, Regex.Split(text, "red|green|blue").Where(Function(s) Not String.IsNullOrWhitespace(s))( डेमो देखें , या यह डेमो जहां LINQ समर्थित है)
  • - text.split(/red|green|blue/)( gयहां संशोधक का उपयोग करने की आवश्यकता नहीं है!) (खाली मूल्यों से छुटकारा पाने के लिए, उपयोग करें text.split(/red|green|blue/).filter(Boolean)), डेमो देखें
  • - text.split("red|green|blue"), या - सभी अनुगामी खाली वस्तुओं को रखने के लिए - उपयोग करें text.split("red|green|blue", -1), या सभी खाली वस्तुओं को हटाने के लिए उन्हें हटाने के लिए अधिक कोड का उपयोग करें ( डेमो देखें )
  • - जावा के समान, text.split(/red|green|blue/)सभी अनुगामी वस्तुओं का उपयोग text.split(/red|green|blue/, -1)करने के लिए और सभी खाली वस्तुओं के उपयोग को हटाने के लिए text.split(/red|green|blue/).findAll {it != ""})( डेमो देखें )
  • - text.split(Regex("red|green|blue"))या, खाली वस्तुओं को हटाने के लिए, उपयोग करें text.split(Regex("red|green|blue")).filter{ !it.isBlank() }, डेमो देखें
  • - text.split("red|green|blue"), या सभी खाली वस्तुओं को रखने के लिए, text.split("red|green|blue", -1)सभी खाली वस्तुओं को हटाने और उपयोग करने के लिए, डेमोtext.split("red|green|blue").filter(_.nonEmpty) देखें ( )
  • - text.split(/red|green|blue/)खाली मूल्यों से छुटकारा पाने के उपयोग .split(/red|green|blue/).reject(&:empty?)(और प्राप्त करने के लिए दोनों प्रमुख और खाली आइटम, उपयोग अनुगामी -1दूसरा तर्क, के रूप में .split(/red|green|blue/, -1)) (देखें डेमो )
  • - my @result1 = split /red|green|blue/, $text;, या सभी खाली वस्तुओं के साथ my @result2 = split /red|green|blue/, $text, -1;, या बिना किसी खाली आइटम के, my @result3 = grep { /\S/ } split /red|green|blue/, $text;( डेमो देखें )
  • - preg_split('~red|green|blue~', $text)या preg_split('~red|green|blue~', $text, -1, PREG_SPLIT_NO_EMPTY)कोई खाली आइटम आउटपुट करने के लिए ( डेमो देखें )
  • - re.split(r'red|green|blue', text)या, खाली आइटम निकालने के लिए, list(filter(None, re.split(r'red|green|blue', text)))( डेमो देखें )
  • - उपयोग करें regexp.MustCompile("red|green|blue").Split(text, -1), और यदि आपको खाली आइटम निकालने की आवश्यकता है, तो इस कोड का उपयोग करें । देखें जाओ डेमो

नोट : यदि आप पैटर्न पर कब्जा करने वाले समूह हैं , तो अतिरिक्त विकल्पों के आधार पर रेगेक्स विभाजन कार्य / तरीके अलग-अलग व्यवहार कर सकते हैं। कृपया उचित विभाजन विधि प्रलेखन देखें।


0

शब्द "लाल" को छोड़कर

var href = '(text-1) (red) (text-3) (text-4) (text-5)';

var test = href.replace(/\((\b(?!red\b)[\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

शब्द "लाल" को छोड़कर

var href = '(text-1) (frede) (text-3) (text-4) (text-5)';

var test = href.replace(/\(([\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = p1.replace(/red/g, '');
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

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