रेगेक्स के लिए, खोज के लिए वाक्यविन्यास क्या है, लेकिन इसमें शामिल नहीं है? कुछ वैसा:
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
रेगेक्स के लिए, खोज के लिए वाक्यविन्यास क्या है, लेकिन इसमें शामिल नहीं है? कुछ वैसा:
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
जवाबों:
कहने का स्पष्ट तरीका "जब तक खोज 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
वैकल्पिक रूप से इसे वैकल्पिक रूप से अलग करने के लिए चारों ओर एक गैर-कैप्चरिंग समूह जोड़ा है )
(?:...)
गैर-कब्जा समूह के कारण है? इसके साथ काम करता है ((?!X).)*
?
grep
sql में 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
$
विकल्प : .*?(?=X)
साथ बदलें.*?(?=X|$)
एक लुकहैड रेगेक्स सिंटेक्स आपको अपने लक्ष्य को प्राप्त करने में मदद कर सकता है। इस प्रकार आपके उदाहरण के लिए एक रेगेक्स है
.*?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
इसे इस्तेमाल करे
(.*?quick.*?)z
grep
, लेकिन यह जवाब देता है।