Regex तक लेकिन शामिल नहीं है


81

रेगेक्स के लिए, खोज के लिए वाक्यविन्यास क्या है, लेकिन इसमें शामिल नहीं है? कुछ वैसा:

Haystack:
The quick red fox jumped over the lazy brown dog

Expression:
.*?quick -> and then everything until it hits the letter "z" but do not include z

जवाबों:


162

कहने का स्पष्ट तरीका "जब तक खोज Xलेकिन शामिल नहीं है X" है:

(?:(?!X).)*

जहां Xकोई भी नियमित अभिव्यक्ति हो सकती है।

आपके मामले में, हालांकि, यह ओवरकिल हो सकता है - यहां सबसे आसान तरीका होगा

[^z]*

यह सिवाय कुछ भी मेल करेगा zऔर इसलिए अगले से ठीक पहले बंद होगा z

तो .*?quick[^z]*मैच होगा The quick fox jumps over the la

हालांकि, जैसे ही आपके पास देखने के लिए एक से अधिक सरल पत्र (?:(?!X).)*हैं, उदाहरण के लिए, खेल में आता है

(?:(?!lazy).)*- शब्द की शुरुआत तक कुछ भी मैच lazy

यह एक लुकहेड जोर का उपयोग कर रहा है , विशेष रूप से एक नकारात्मक लाहहेड।

.*?quick(?:(?!lazy).)*मैच होगा The quick fox jumps over the

स्पष्टीकरण:

(?:        # Match the following but do not capture it:
 (?!lazy)  # (first assert that it's not possible to match "lazy" here
 .         # then match any character
)*         # end of group, zero or more repetitions.

इसके अलावा, जब कीवर्ड खोज रहे हैं, तो आप उन्हें शब्द सीमा एंकर के साथ घेरना चाह सकते हैं: \bfox\bकेवल पूर्ण शब्द से मेल खाएगा, foxलेकिन लोमड़ी अंदर नहीं foxy

ध्यान दें

यदि मिलान किए जाने वाले पाठ में लाइनब्रीक भी शामिल हो सकते हैं, तो आपको अपने रेक्सक्स इंजन के "डॉट मैच ऑल" विकल्प को सेट करना होगा। आमतौर पर, आप इसे (?s)regex के लिए तैयार करके प्राप्त कर सकते हैं , लेकिन यह सभी regex इंजन (विशेष रूप से जावास्क्रिप्ट) में काम नहीं करता है।

दूसरा तरीका:

कई मामलों में, आप एक सरल, अधिक पठनीय समाधान का उपयोग कर सकते हैं जो एक आलसी मात्रा का उपयोग करता है। एक जोड़ कर ?करने के लिए *परिमाणक, यह वर्तमान स्थिति से संभव के रूप में कुछ पात्रों के रूप में बनाने का प्रयास करेगा:

.*?(?=(?:X)|$)

किसी भी संख्या में वर्णों से मेल खाएगा, X(जो किसी भी regex हो सकता है) या स्ट्रिंग के अंत से पहले रोकना (यदि Xवह मेल नहीं खाता)। काम करने के लिए आपको "डॉट मैच ऑल" विकल्प भी सेट करना पड़ सकता है। (नोट: मैंने Xवैकल्पिक रूप से इसे वैकल्पिक रूप से अलग करने के लिए चारों ओर एक गैर-कैप्चरिंग समूह जोड़ा है )


+1 वास्तव में अच्छा जवाब, दुर्भाग्य से साथ काम नहीं करता है grep, लेकिन यह जवाब देता है।
एलेक्जेंडर लावोई

@AlexandreLavoie: दिलचस्प है। दूसरे को काम क्यों करना चाहिए और यह एक को नहीं? दोनों ही लुकहेड अभिकथन का उपयोग करते हैं। शायद यह (?:...)गैर-कब्जा समूह के कारण है? इसके साथ काम करता है ((?!X).)*?
टिम पीटरज़

1
वास्तव में पता नहीं है, मैं एक रेगीक्स विशेषज्ञ नहीं हूँ और न ही grep। मैं grepsql में mysql बिन ट्रांसफार्मर से केवल एक डेटाबेस के लिए अनुरोधों को फ़िल्टर करने के लिए उपयोग कर रहा था । यहाँ जानवर है:grep -Po "(?s)use database_to_keep(.*?)(?=^use)" mysql-bin.000045.sql > filtered.sql
अलेक्जेंड्रे लावोई

जब मैं Upचाबी मारता हूं , तब से बैश संघर्ष जैसा लगता है , अंतिम कमांड वह नहीं है जिसका मैंने उपयोग किया है:grep -Po "(?s)use database_to_keep(.*?)(?:(?!^use).)*" mysql-bin.000045.sql > filtered.sql
एलेक्जेंडर लावोई

1
अच्छा संपादन, @ टिम, बस जोड़ें $ विकल्प : .*?(?=X)साथ बदलें.*?(?=X|$)
विकटोरिया Stribi Mayew

15

एक लुकहैड रेगेक्स सिंटेक्स आपको अपने लक्ष्य को प्राप्त करने में मदद कर सकता है। इस प्रकार आपके उदाहरण के लिए एक रेगेक्स है

.*?quick.*?(?=z)

और लुकहेड .*?से पहले आलसी मिलान को नोटिस करना महत्वपूर्ण है (?=z): अभिव्यक्ति पहले की घटना तक एक विकल्प से मेल खाती हैz पत्र के है।

यहाँ C # कोड नमूना है:

const string text = "The quick red fox jumped over the lazy brown dogz";

string lazy = new Regex(".*?quick.*?(?=z)").Match(text).Value;
Console.WriteLine(lazy); // The quick red fox jumped over the la

string greedy = new Regex(".*?quick.*(?=z)").Match(text).Value;
Console.WriteLine(greedy); // The quick red fox jumped over the lazy brown dog

0

इसे इस्तेमाल करे

(.*?quick.*?)z

3
इसमें मैच में "z" शामिल है, जो पूछने वाले से बचना चाहता है। शायद रेगेक्स को 'में एक शब्द होने का इरादा है। वैकल्पिक, और उस वैकल्पिक regex का उपयोग कई मिलान करने के लिए किया जाता है। यदि "z" एक स्ट्रिंग की शुरुआत है जिसे विकल्प में एक और शब्द से मिलान किया जाएगा , तो यह मैच जब्त कर लिया जाएगा क्योंकि "z" वर्तमान मैच से पहले ही भस्म हो गया है।
Szczepan Hołyszewski
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.