रेगेक्स के साथ "उलटा मैच" कैसे करें?


112

मैं RegexBuddy का उपयोग कर रहा हूँ, लेकिन मैं इस चीज़ से वैसे भी परेशानी में हूँ: \ _

मैं एक फ़ाइल को लाइन द्वारा प्रसंस्करण कर रहा हूँ। मैंने जो चाहा, उसे मिलाने के लिए "लाइन मॉडल" बनाया।

अब मैं एक उलटा मैच करना चाहूंगा ... यानी मैं उन लाइनों का मिलान करना चाहता हूं जहां 6 अक्षरों की एक स्ट्रिंग है, लेकिन केवल अगर ये छह अक्षर एंड्रिया नहीं हैं , तो मुझे यह कैसे करना चाहिए?


संपादित करें: मैं इस रेगेक्स का उपयोग करने वाले कार्यक्रम को लिखूंगा, मुझे अभी तक नहीं पता है कि अगर अजगर या php में, मैं कुछ regex सीखने के लिए सबसे पहले यह काम कर रहा हूं :) विभिन्न प्रकार की रेखाएं हैं, मैं regex का उपयोग करना चाहता था उस प्रकार का चयन करने के लिए जिसमें मुझे दिलचस्पी है। एक बार जब मुझे ये लाइनें मिल जाती हैं तो मुझे एक अन्य फ़िल्टर लागू करना होता है ताकि किसी ज्ञात मूल्य से मेल न खाए, मुझे अन्य सभी की आवश्यकता है, न कि। (? नहीं! चाहता था) बहुत अच्छा काम कर रहा है, धन्यवाद। :-)

मुझे आशा है कि यह सवाल स्पष्ट करता है :)


यह वास्तव में लगता है कि आप हमें क्या कर रहे हैं, इसके बारे में थोड़ी और जानकारी देने के लिए बेहतर कर सकते हैं और देखें कि क्या कोई व्यक्ति वैकल्पिक समाधान की पेशकश कर सकता है। आमतौर पर, प्रत्येक पंक्ति से मेल खाने वाली एक नियमित अभिव्यक्ति का निर्माण करके एक संपूर्ण फ़ाइल को पार्स करने का प्रयास एक जटिल मार्ग है :)
Dan

जवाबों:


70
(?!Andrea).{6}

अपने regexp इंजन को मानकर नकारात्मक लुकहेड का समर्थन करता है।

संपादित करें: .. या आप के [A-Za-z]{6}स्थान पर उपयोग करना पसंद करेंगे.{6}

संपादित करें (फिर से): ध्यान दें कि लुकहेड्स और लुकबाइंड आमतौर पर एक नियमित अभिव्यक्ति मैच को "उलटा" करने का सही तरीका नहीं है। Regexps वास्तव में नकारात्मक मिलान करने के लिए सेट नहीं किए गए हैं, वे इसे छोड़ देते हैं कि आप जिस भी भाषा में उनका उपयोग कर रहे हैं।


आपको ^ कि @Vinko Vrsalovic का उपयोग करने की आवश्यकता है ताकि यह "ndrea \ n" पर मेल न खाए
bdukes

2
। डिफ़ॉल्ट रूप से \ n से मेल नहीं खाता (कुछ भाषाएँ [उदा। पर्ल] आपको उस व्यवहार पर स्विच करने की अनुमति देती है, लेकिन डिफ़ॉल्ट रूप से सब कुछ मेल खाता है)।
डेन

1
(प्लस, ओपी ने उल्लेख नहीं किया कि स्ट्रिंग को लाइन के शुरू होने पर होना था)
दान

1
ओपी के लिए आपका क्या मतलब है?
एंड्रिया अंबू

1
एंड्रिया: ओपी का अर्थ है "मूल पोस्टर", इसलिए, मैं आपका उल्लेख कर रहा था :)
दान

47

पायथन / जावा के लिए,

^(.(?!(some text)))*$

http://www.lisnichenko.com/articles/javapython-inverse-regex.html


4
यह काम नहीं करता है। आप टेम्पर्ड लालची टोकन मुहावरा के बारे में सोच रहे हैं। लेकिन डॉट को पहले नहीं बल्कि लुकहेड के बाद जाना है । इस प्रश्न को देखें । लेकिन वह तरीका वैसे भी इस काम के लिए ओवरकिल है।
एलन मूर

पता नहीं यह किस भाषा में लिखा गया है, लेकिन मेरे परीक्षण डेटा को साफ करने के लिए उदात्त पाठ में एक आकर्षण की तरह काम किया। धन्यवाद!
मथायस डाइरिकक्स

1
@AlanMoore वास्तव में, यह इस उपयोग के मामले के लिए लगभग काम करेगा। हालांकि, अगर some textलाइन शुरू होती है , तो यह गलत परिणाम देगा।
ज़ेनेक्सर

2
@Zenexer, यही मेरा मतलब है। यदि डॉट पहले की बजाय लुकहेड के बाद है, तो यह पूरी तरह से काम करता है।
एलन मूर

यहाँ एक लिंक है जो और अधिक व्याख्या करता है। मुझे समझ नहीं आता कि ?!सिर्फ और सिर्फ क्यों !
टिमो

21

एलन मूर से प्रतिक्रिया के साथ अपडेट किया गया

पीसीआरई और इसी तरह के वेरिएंट में, आप वास्तव में एक रेगेक्स बना सकते हैं जो किसी भी लाइन से मेल खाता है जिसमें मूल्य नहीं है:

^(?:(?!Andrea).)*$

इसे टेम्पर्ड लालची टोकन कहा जाता है । नकारात्मक पक्ष यह है कि यह अच्छा प्रदर्शन नहीं करता है।


1
यह लंबे समय में टेम्पर्ड लालची टोकन है। [\s\S]दूसरे लुकहेड के बाद बस डॉट (या , जो केवल जावास्क्रिप्ट में उपयोगी है) डालें और आपको पहले वाले की आवश्यकता नहीं है ^(?:(?!Andrea).)*$:।
एलन मूर

@AlanMoore अच्छा लगा! मुझे ऐसा कोई भी स्थापित पैटर्न नहीं मिला जो इस तरह काम करता हो, इसलिए मैं अपने साथ आया। मुझे अपना जवाब लेने के बजाय, आपको इसे अपने रूप में प्रदान करना चाहिए।
Zenexer

यह ठीक है, पहले से ही बहुत अच्छे उत्तर हैं। और आप अपने दम पर मुहावरे का आविष्कार करने के लिए श्रेय के पात्र हैं। चीयर्स!
एलन मूर

आप उपयोग करने का सुझाव क्यों देते हैं [\S\s]? ओपी "एंड्रिया" शब्द को शामिल न करते हुए, लाइनों के मिलान की बात कर रहा है। यह जाँचने के बारे में नहीं कि क्या पूरे स्ट्रिंग में यह शब्द है। क्या मैं कुछ भूल रहा हूँ?
x-यूरी

@ x- यूरी मुझे लगता है कि तुम सही हो। मैंने शायद इस सवाल का जवाब दिया था कि मैं पहली बार विसंगति की अनदेखी करते हुए इस पृष्ठ पर गया था। मेरा कनेक्शन अभी उत्तर को अपडेट करने के लिए पर्याप्त नहीं है, हालांकि (<10 kbps)
Zenexer

11

आप किस भाषा का उपयोग कर रहे हैं? इसके लिए रेगेक्स कार्यान्वयन मामले की क्षमताएं और वाक्यविन्यास।

आप लुक-फॉरवर्ड का उपयोग कर सकते हैं। उदाहरण के रूप में अजगर का उपयोग करना

import re

not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)

उसको तोड़ने के लिए:

(; एंड्रिया) का अर्थ है 'मैच अगर अगले 6 अक्षर "एंड्रिया" नहीं हैं "; अगर ऐसा है तो

\ w का अर्थ है "शब्द वर्ण" - अल्फ़ान्यूमेरिक वर्ण। यह वर्ग [a-zA-Z0-9_] के बराबर है

\ w {6} का अर्थ ठीक 6 शब्द अक्षर है।

re.IGNORECASE का मतलब है कि आप "एंड्रिया", "एंड्रिया", "एंड्रिया" को छोड़ देंगे ...

दूसरा तरीका यह है कि अपने प्रोग्राम लॉजिक का उपयोग करें - एंड्रिया से मेल न खाने वाली सभी लाइनों का उपयोग करें और उन्हें 6 अक्षरों की जांच करने के लिए एक दूसरे रेगेक्स के माध्यम से डालें। या पहले कम से कम 6 शब्द वर्णों की जांच करें, और फिर जांचें कि यह एंड्रिया से मेल नहीं खाता है।


7

नकारात्मक दिखावे का दावा

(?!Andrea)

यह बिल्कुल उलटा मैच नहीं है, लेकिन यह सबसे अच्छा है जिसे आप सीधे रेगेक्स के साथ कर सकते हैं। हालांकि सभी प्लेटफ़ॉर्म उनका समर्थन नहीं करते हैं।


1
जब तक प्रश्नकर्ता स्पष्ट नहीं करता, तब तक मैं यह नहीं देखता कि मैच लाइन के शुरू में शुरू होना है। तो क्यों ^?
हामिश डाउनर

क्योंकि मुझे समझ में आया कि वह लाइन की शुरुआत में जाँच करना चाहते थे, इसलिए दिए गए स्पष्टीकरण को संपादित किया
विंको वर्सालोविच

5

यदि आप RegexBuddy में ऐसा करना चाहते हैं, तो रेगेक्स से मेल नहीं खाने वाली सभी लाइनों की सूची प्राप्त करने के दो तरीके हैं।

टेस्ट पैनल पर टूलबार पर, टेस्ट स्कोप को "लाइन बाय लाइन" पर सेट करें। जब आप ऐसा करते हैं, तो बिना टूलबार के एक आइटम सूची सभी पंक्तियाँ एक ही टूलबार पर सूची सभी बटन के नीचे दिखाई देंगी। (यदि आपको सूची ऑल बटन नहीं दिख रहा है, तो मुख्य टूलबार में मैच बटन पर क्लिक करें।)

GREP पैनल पर, आप "लाइन-बेस्ड" और "इनवर्ट रिजल्ट्स" चेकबॉक्स को चालू कर सकते हैं, उन फाइलों में नॉन-मैचिंग लाइन की सूची प्राप्त करने के लिए जिन्हें आप देख रहे हैं।


5

(?!अभ्यास में उपयोगी है। हालांकि सख्ती से बोलना, आगे देखना नियमित अभिव्यक्ति नहीं है जैसा कि गणितीय रूप से परिभाषित किया गया है।

आप मैन्युअल रूप से एक औंधा नियमित अभिव्यक्ति लिख सकते हैं।

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


1

मैं अभी इस पद्धति के साथ आया था जो हार्डवेयर गहन हो सकता है लेकिन यह काम कर रहा है:

आप सभी वर्णों को प्रतिस्थापित कर सकते हैं जो एक खाली स्ट्रिंग द्वारा रेगेक्स से मेल खाते हैं।

यह एक ऑनलाइनर है:

notMatched = re.sub(regex, "", string)

मैंने इसका उपयोग किया क्योंकि मुझे एक बहुत ही जटिल रेक्सक्स का उपयोग करने के लिए मजबूर किया गया था और यह पता नहीं लगा सका कि समय की उचित मात्रा के भीतर इसके प्रत्येक भाग को कैसे उल्टा करना है।

यह आपको केवल स्ट्रिंग परिणाम लौटाएगा, किसी भी मैच ऑब्जेक्ट नहीं!


-3

पर्ल में आप कर सकते हैं

प्रक्रिया ($ लाइन) यदि ($ लाइन = ~! / एंड्रिया /);


4
वह वाक्य रचना गलत है। मुझे लगता है कि आप का मतलब है प्रक्रिया ($ लाइन) अगर $ लाइन! ~ / एंड्रिया /
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.