2012-08-08 14 views
15

मैं एक बड़े पाठ के बिना स्ट्रिंग लगता है:रेग्युलर एक्सप्रेशंस: सबस्ट्रिंग

"Big piece of text. This sentence includes 'regexp' word. And this 
sentence doesn't include that word" 

मैं सबस्ट्रिंग कि द्वारा 'इस' शुरू होता है और द्वारा 'शब्द' समाप्त होता है खोजने की जरूरत है लेकिन नहीं है शब्द 'regexp' शामिल करें।

इस मामले में स्ट्रिंग: "this sentence doesn't include that word" वही है जो मैं प्राप्त करना चाहता हूं।

मैं नियमित अभिव्यक्तियों के माध्यम से ऐसा कैसे कर सकता हूं?

+0

आपके नियम भ्रमित हैं या आपने अपने अपेक्षित आउटपुट के साथ गलती की है। क्यों नहीं "और" और क्यों नहीं "पाठ का बड़ा टुकड़ा।" – sjakubowski

+0

@sjakubowski "substring 'इस' से शुरू होता है और 'शब्द' से समाप्त होता है" – Mathletics

+0

ये नियम उलझन में हैं लेकिन सही हैं। मैंने Google में कुछ खोजने के लिए बहुत समय बिताया लेकिन कुछ भी नहीं मिला। – Artem

उत्तर

27

, निम्नलिखित काम करना चाहिए:

\bthis\b(?:(?!\bregexp\b).)*?\bword\b 

उदाहरण: http://www.rubular.com/r/g6tYcOy8IT

स्पष्टीकरण:

\bthis\b   # match the word 'this', \b is for word boundaries 
(?:    # start group, repeated zero or more times, as few as possible 
    (?!\bregexp\b) # fail if 'regexp' can be matched (negative lookahead) 
    .     # match any single character 
)*?    # end group 
\bword\b   # match 'word' 

\b प्रत्येक शब्द आसपास सुनिश्चित करें कि आप सबस्ट्रिंग पर मिलान नहीं कर रहे हैं, 'थीस्ल', या 'अधिक शब्दों' में 'शब्द' में 'इस' से मेल खाते की तरह बना देता है।

यह आपके प्रारंभ शब्द और आपके अंतिम शब्द के बीच प्रत्येक वर्ण को जांचकर यह सुनिश्चित करने के लिए काम करता है कि बहिष्कृत शब्द नहीं होता है।

+2

यह वही है जो मुझे चाहिए! धन्यवाद! Regex के अच्छे स्पष्टीकरण और इसके साथ खेलने के लिंक के लिए – Artem

+2

+1 - मैं इसे कुछ इसी तरह लागू करने में सक्षम था और स्पष्टीकरण के बिना संघर्ष कर रहा था। मैं जवाबों से तंग आ गया हूं कि यह बताए बिना कोड का थोड़ा सा कोड दें कि यह कैसे काम करता है। –

+0

आपने मेरी बहुत मदद की! धन्यवाद! –

3

लुकहेड आकलन का उपयोग करें।

आप अगर एक स्ट्रिंग एक और स्ट्रिंग शामिल नहीं है की जांच करना चाहते हैं, तो आप लिख सकते हैं:

/^this(?!.*substring).*word$/ 
:

/^(?!.*substring)/ 

तुम भी शुरुआत और this और word के लिए पंक्ति के अंत की जांच करना चाहिए

यहां एक और समस्या यह है कि आप तारों को खोजने में काम नहीं करते हैं, आप वाक्यों को ढूंढना चाहते हैं (यदि मैं आपका कार्य सही समझता हूं)।

तो समाधान इस तरह दिखता है:

perl -e ' 
    local $/; 
    $_=<>; 
    while($_ =~ /(.*?[.])/g) { 
    $s=$1; 
    print $s if $s =~ /^this(?!.*substring).*word[.]$/ 
    };' 

उपयोग के उदाहरण: एक मामले को अनदेखा करें विकल्प के साथ

$ cat 1.pl 
local $/; 
$_=<>; 
while($_ =~ /(.*?[.])/g) { 
    $s=$1; 
    print $s if $s =~ /^\s*this(?!.*regexp).*word[.]/i; 
}; 

$ cat 1.txt 
This sentence has the "regexp" word. This sentence doesn't have the word. This sentence does have the "regexp" word again. 

$ cat 1.txt | perl 1.pl 
This sentence doesn't have the word. 
+0

अकेले उस लुकहेड नौकरी नहीं करेगा; आपको नेस्टेड लुकहेड का उपयोग करने की आवश्यकता है। और कोड स्निपेट जो पढ़ता है उसे पढ़ना मुश्किल है (मुझे पर्ल नहीं पता) बिना स्पष्टीकरण के। :/ – KRyan

+0

@ ड्रगूनवाइथ: आप किसके बारे में बात कर रहे हैं? यह आत्मा कार्य को हल करती है। आप इसे स्वयं आज़मा सकते हैं। –

+0

मैंने RegEx पोस्ट करने की कोशिश की और ऐसा नहीं किया। '(?! 'इसे किसी भी मामले से मिलान करने से रोक देगा जहां सबस्ट्रिंग' इस '(उदाहरण से) के बाद दिखाई देता है, भले ही सबस्ट्रिंग' शब्द 'के बाद दिखाई दे। भले ही नेस्टेड' (? :(?! 'प्रति एफजे' इसका जवाब ठीक करता है।मेरे पास उस स्निपेट का परीक्षण करने के लिए पर्ल उपलब्ध नहीं है, लेकिन मैं इसे देखकर कुछ भी नहीं सीख रहा हूं, और जो भी मैं * बता सकता हूं कि यह एक RegEx समाधान नहीं है, क्योंकि यह मैन्युअल रूप से स्ट्रिंग के माध्यम से चल रहा है कि 'जबकि' लूप। प्रश्न का टैग 'regex' 'perl' नहीं है। – KRyan

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