2012-08-08 73 views
15

我有一個大的文本:正則表達式:找到字符串,不串

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

我需要找到子,通過「」開始和「」結束,但包括字'正則表達式'。

在這種情況下字符串:「this sentence doesn't include that word」正是我想要接收的。

我該如何通過正則表達式來做到這一點?

+0

您的規則很混亂,或者您的預期輸出出現錯誤。爲什麼不「和」以及爲什麼沒有「大段文字」。 – sjakubowski 2012-08-08 17:20:27

+0

@sjakubowski「子字符串由'this'開始,以'word'結尾」 – Mathletics 2012-08-08 17:22:15

+0

這條規則令人困惑,但是正確。我花了很多時間在谷歌找到一些東西,但什麼都沒發現。 – Artem 2012-08-08 17:26:05

回答

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

這正是我需要的!謝謝! – Artem 2012-08-08 17:36:19

+2

+1對於正則表達式的正確解釋以及與之相關的鏈接 - 我可以將它應用於類似的東西,如果沒有解釋,我們就會掙扎。我厭倦了只是給出了一些代碼而沒有說明它是如何工作的答案。 – 2016-11-17 17:32:48

+0

你幫了我很多!謝謝! – 2018-01-15 08:13:14

3

使用lookahead斷言。

當您想檢查一個字符串不包含另一個子,你可以寫:

/^(?!.*substring)/ 

您還必須檢查開始和線對thisword末:

/^this(?!.*substring).*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

獨自一人看不起這個工作;你需要使用嵌套的lookaheads。接下來的代碼片段很難閱讀(我不知道Perl),沒有任何解釋。 :/ – KRyan 2012-08-08 17:29:53

+0

@DragoonWraith:你在說什麼?這靈魂確實解決了這個任務。你可以自己嘗試。 – 2012-08-08 17:33:22

+0

我試過RegEx發佈,它沒有這樣做。 '(?!')將防止它匹配子字符串出現在this後面的情況(從示例中),即使子字符串出現在「word」後面也使用嵌套的'(?:(???'per FJ'答案解決了這個問題。我沒有Perl可用於測試該代碼段,但是我沒有通過查看它學到任何東西,並且從我能*告訴它不是RegEx解決方案,因爲它似乎是通過手動遍歷字符串那'while'循環。問題的標籤'regex'不是'perl'。 – KRyan 2012-08-08 17:37:13

相關問題