2017-11-04 110 views
1

我有一個文件,我希望使用正則表達式在關鍵字之間匹配某個單詞。例如,假設我想在關鍵字「開始」之後和關鍵字「結束」之前匹配單詞「狗」的每次出現。在正則表達式中查找兩個單詞之間的詞

dog horse animal cat dog // <-- don't match 
random text dog // <-- don't match 
start 

brown dog 
black dog 
cat horse animals 

end 
dog cat // <-- don't match 
good dog // <-- don't match 

也許正則表達式有一個管的功能,使我能得到這個詞「開始」字之前的「結束」後的文本,然後通過管道到一個新的正則表達式?然後,我可以在第二個正則表達式中搜索「狗」。我對正則表達式很陌生,一直在努力想出一個解決方案。謝謝

+0

你不能,基本上因爲看後面必須是固定長度。 – Bohemian

回答

3

當你匹配「全局」(即收集多個匹配是不連續的),你提供一個規定諸如「比賽都必須在容器中存在「(在這種情況下,間‘開始’和‘結束’),這通常要求的構建體如PCRE的‘\ G’,其僅在第一次嘗試位置相匹配:

(?:\G(?!\A)|start)(?:(?!end).)*?\Kdog 

參見實例在:https://regex101.com/r/uV7EjE/1

重要的是要指出,這使用了一些不被普遍支持的構造,並且一個特定於PCRE('\ K')的構造。每個部分的解釋:

/(?: 
\G(?!\A)  # Match only at the first position, since the usual behaviour of regex is to attempt to match at each position. In effect, this ensures we only match immediately after the last valid "dog". 
|start   # Or match "start". 
) 
(?:(?!end).)*? # Match as few characters as possible, making sure we don't encounter "end". 
\K    # Reset the consumption counter so everything before this isn't matched. 
dog    # Match what we want. 
/gmsx 

相反,如果你需要更廣泛的支持一些更基本的正則表達式引擎,那麼你確實需要管一簡單的表達,例如start.*?end匹配一個完整的組,然後檢查其所有出現的「狗」的內容。

+0

哇,這是一個非常聰明和有趣的解決方案。感謝您的詳細解釋! – Michael

+0

哈哈謝謝,並樂意幫忙!它基本上是標準的「x」和「y」解決方案之間的匹配,但如果我們知道有關輸入的某些內容,我們可以更加聰明。例如,如果我們知道「結束」將不會出現,並且沒有「開始」就不會存在,那麼我們可以簡單地向前看,看看是否有「結束」,例如:'狗(?= ?:(?!開頭)。)*?結束)'這是更簡單,更普遍支持:) – jaytea

+0

很高興知道,似乎它可以非常有用的查找特定值之間的HTML標籤。 – Michael

-1

我知道你在問正則表達式,但是如果你使用某種語言,可能會有更多的解決方案。例如,在PHP這個功能將工作:

function getStringBetween($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 
+0

我的觀點是:如果您可以用某種語言提出解決方案,人們可​​能會更好地提供幫助。 – Bing

+0

無論誰評論,刪除他們的評論和downvoted ...解釋會有所幫助。 – Bing

0

更新:

開始(狗)+年底

測試下面的鏈接,在這裏(?)(?)是一個屏幕:

enter image description here

以前: (請注意,這可能不完全回答你因爲它很大程度上取決於你工作的語言)

Ref。 1 link Ref。 2 link

這也取決於您正在開發的語言,因爲其他評論說。如果你能讓我知道你在哪裏發展,我可能會給你一個更好的答案。

此外可以使用此調試https://regex101.com/

+0

我無法使用regex101中的正則表達式來突出顯示單詞。我需要這個在bash腳本中工作,所以我相信任何標準的正則表達式都可以工作,如果有幫助的話。我的任務需要一個正則表達式語句,而不使用任何其他的bash命令或工具 – Michael

+0

我看到...好吧,我會嘗試查找並完全匹配並在此處回覆。感謝您的反饋 – oetoni

+0

非常感謝。我會檢查出你鏈接的那些文章 – Michael

相關問題