पूरे रेगेक्स को कैसे नकारें?


96

मेरे पास एक उदाहरण है, उदाहरण के लिए (ma|(t){1})। यह मेल खाता है maऔर मेल tनहीं खाता है bla

मैं regex को नकारना चाहता हूं, इस प्रकार यह मेल करना चाहिए blaऔर नहीं maऔर t, इस regex में कुछ जोड़कर । मुझे पता है कि मैं लिख सकता हूं bla, वास्तविक रेगेक्स हालांकि अधिक जटिल है।


5
एक तरफ के रूप में, {1}पूरी तरह से बेकार है। (यदि आपको लगता है कि यह कुछ मूल्य प्रदान करता है, तो आप क्यों नहीं लिखते ((m{1}a{1}){1}|(t){1}){1}?)
ट्रिपल जू

जवाबों:


100

नकारात्मक लुकअप का उपयोग करें: (?!pattern)

सकारात्मक लुकरॉइड्स का उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि एक पैटर्न मेल खाता है। नकारात्मक लुकअप विपरीत है: इसका उपयोग यह दिखाने के लिए किया जाता है कि एक पैटर्न मेल नहीं खाता है। कुछ स्वाद मुखरता का समर्थन करते हैं; कुछ लुकबाइंड आदि पर सीमाएं लगाते हैं।

नियमित-expressions.info के लिंक

यह सभी देखें

और ज्यादा उदाहरण

ये अभ्यास के रूप में खिलौना समस्याओं के लिए रेगेक्स समाधान के साथ आने का प्रयास कर रहे हैं; यदि आप लुकरॉइड्स का उपयोग कर सकते हैं (उन्हें घोंसले के शिकार करने के लिए, उन्हें पकड़ने के लिए उपयोग कर रहे हैं, आदि) सीखने के लिए वे प्रयास कर रहे हैं, तो आपको शैक्षिक होना चाहिए:


2
regular-expressions.info सभी चीजों के लिए एक अच्छा संसाधन है regex।
फ़्रीहिट

क्या सभी को समर्थन दिखता है ? साथ काम नहीं करता है grep
लेज़र

Pattern.compile("(?!(a.*b))").matcher("xab").matches()होना चाहिए true, है ना?
कार्ल रिक्टर

4
मुझे यह सही नहीं लगता, सही विकल्प के लिए stackoverflow.com/questions/8610743/… देखें ।
कार्ल रिक्टर

56

यह मानते हुए कि आप केवल उस आवेश को हटाना चाहते हैं जो रेक्सक्स से पूरी तरह से मेल खाता है (यानी, mmblaठीक है, लेकिन mmनहीं है), यह वही है जो आप चाहते हैं:

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$)एक नकारात्मक रूपांतर है ; यह कहता है "वर्तमान स्थिति से शुरू होकर, अगले कुछ अक्षर स्ट्रिंग के अंत तक नहीं हैं mm या tउसके बाद नहीं हैं ।" शुरुआत में स्टार्ट एंकर ( ^) यह सुनिश्चित करता है कि स्ट्रिंग की शुरुआत में लुकहेड लागू किया जाता है। यदि वह सफल हो .*जाता है , तो आगे बढ़ता है और स्ट्रिंग का उपभोग करता है।

FYI करें, यदि आप जावा का उपयोग कर रहे हैं matches() विधि वास्तव में ^और अंतिम की $आवश्यकता नहीं है, लेकिन वे कोई नुकसान नहीं करते हैं। $अंदर अग्रदर्शी आवश्यक है, हालांकि है।


2
इस उत्तर का सबसे उपयोगी हिस्सा यह है कि आपको .*अपने रेगेक्स के अंत में जोड़ना होगा, अन्यथा यह हर स्ट्रिंग को अस्वीकार कर देगा।
रवि

2
$ अंदर नकारात्मक अग्रदर्शी, और .*अंत में दोनों महत्वपूर्ण बिट्स हैं। हमेशा की तरह आरईएस के साथ, यूनिट परीक्षणों का एक मजबूत सेट सही होने के लिए बिल्कुल महत्वपूर्ण है। यह उत्तर 100% सही है।
टॉम डिब्बल

1
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

यह दिए गए rexx के लिए है।
शब्द सीमा को खोजने के लिए the \ b है।
सकारात्मक नज़र आगे (=? w) रिक्त स्थान से बचने के लिए है।
मूल रेगेक्स के आगे नकारात्मक रूप इसके मैचों को रोकने के लिए है।
और अंत में (\ w *) उन सभी शब्दों को पकड़ना है जो बचे हैं।
वह समूह जो शब्दों को धारण करेगा, समूह 3 है
। सरल (?! पैटर्न) काम नहीं करेगा क्योंकि कोई उप-स्ट्रिंग
सरल ^ (?? (?: m {2} | t) $) से मेल खाएगी । * $। काम नहीं के रूप में यह बारीकियों पूर्ण लाइनों है


0

इसे लागू करें यदि आप लार्वा का उपयोग करते हैं।

लारवेल के पास एक not_regex है जहां सत्यापन के तहत क्षेत्र को दिए गए नियमित अभिव्यक्ति से मेल नहीं खाना चाहिए; PHP preg_matchफ़ंक्शन का आंतरिक रूप से उपयोग करता है ।

'email' => 'not_regex:/^.+$/i'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.