2010-03-08 9 views
60

मुझे पता है कि निम्नलिखित रेगेक्स "लाल", "हरा", या "नीला" से मेल खाएगा।निर्दिष्ट तारों को छोड़कर सबकुछ मिलान करें

red|green|blue 

इसमें कई निर्दिष्ट स्ट्रिंग के अलावा सब कुछ से मेल करने का एक सरल तरीका है?

+1

नियमित अभिव्यक्तियों के सभी स्वाद इस प्रकार नहीं कर सकते हैं। आप किस पर्यावरण में काम कर रहे हैं? जावा? पर्ल? नेट? कुछ सी/सी ++ regex पुस्तकालय? एक आरडीबीएमएस? – FrustratedWithFormsDesigner

+5

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

उत्तर

28

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

(?!red|green|blue) 

(धन्यवाद वाक्य रचना सुधार के लिए, ऊपर है वैध जावा और पर्ल, YMMV)

+2

आपका मतलब है '(?! लाल | हरा | नीला) '। –

+1

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

+4

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

87

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

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

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

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

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

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

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

+1

@Russ बग को इंगित करने के लिए धन्यवाद। मैंने जवाब संपादित कर लिया है। मैंने इसे कुछ कोष्ठक के साथ तय किया है, लेकिन '। *' की अतिरिक्त प्रतियों के साथ आपका फ़िक्स भी अच्छा है। हालांकि, मैं पीछे की ओर आश्वस्त नहीं हूं। * की आवश्यकता है। –

+0

पिछला। * यदि आप सिर्फ एक मैच के लिए बूलियन चेक चाहते हैं तो इसकी आवश्यकता नहीं है। यदि आप वास्तव में पूर्ण मिलान पाठ चाहते हैं तो आपको इसकी आवश्यकता है। इसके अलावा ... आपका नया समाधान अच्छा और साफ है। धन्यवाद! – Russ

5

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

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

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

। * इस तरह के नकारात्मक दिखने के अंदर रखा जाना चाहिए:^(?!। * लाल | हरा | नीला) या यह पहला तत्व शेष से अलग व्यवहार करेगा (यानी "दूसरा" "अन्यग्रीन" के दौरान मिलान किया जाएगा)

15

आपको नकारात्मक दिखने की आवश्यकता नहीं है।वहाँ काम कर रहे उदाहरण है:

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

विवरण:

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

उदाहरण:

redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered

होगा:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

टेस्ट यह: regex101.com

1155 कदम उठा लेता है, लेकिन अगर किसी को यह कर सकते हैं इंप्रोव ई मेरी सराहना की जाएगी। शुरू

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

यह कहते हैं,:

+1

यह उत्तर बेहतर होगा अगर आपने समझाया कि पैटन कैसे काम करता है। – Lii

+0

@Lii मुझे नहीं पता कि इस पैटर्न में क्या समझाया जाना चाहिए। यह मूल regex है। – hlcs

+4

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

5

कुछ भी मिलान लेकिन यह देखते हुए स्ट्रिंग्स

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

आप इसे यहाँ की कोशिश कर सकते हैं: https://regex101.com/r/rMbYHz/2

ध्यान दें कि यह केवल regex इंजन है कि एक negative lookahead समर्थन के साथ काम करता है।

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