2017-06-28 92 views
2

我有一些文字,它看起來像這樣刪除包含特定短語的文本塊:如何通過正則表達式

12 12 obj 
<< 
Some content here 
>> 
endobj 
12 13 obj 
<< 
Some content here with a email address that contains @mail. 
>> 
endobj 
11 12 obj 
<< 
Some more content here 
>> 
endobj 

我想刪除任何文本塊,開始/d+ /d+ obj(如12 13 obj )到它們在endobj處結束的地方,它們包含特定的字符串,在這種情況下,它將是@mail。我在尋找正確的RegEx時遇到了一些麻煩。

我能夠成功地選擇與(\d+\ \d+\ obj[\s\S]+?endobj) 見測試在這裏每個塊:https://regex101.com/r/V4WAMl/5

但我無法得到這個工作,因爲我想(\d+\ \d+\ obj[\s\S][email protected][\s\S]+?endobj) 看到這裏測試:https://regex101.com/r/V4WAMl/4

我有一個想法爲什麼會發生,但我不確定如何解決它。我的理論是懶惰修飾符是貪婪的,因爲它最初不匹配,所以它停在下一個匹配的匹配。我嘗試過各種排除^(?:*****)的組合,但是當我嘗試時,這些組合似乎並不匹配。

回答

0

使用以下解決方案:

\d+ \d+ obj(?:(?!\d+ \d+ obj)[\s\S])*[email protected][\s\S]+?endobj 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

regex demo

詳細

  • \d+ \d+ obj - 1個或多個數字,空間,1+數字,obj
  • (?:(?!\d+ \d+ obj)[\s\S])*? - 任何字符([\s\S]),它不是\d+ \d+ obj序列的起點(因此,正則表達式引擎將無法溢出到下一個\d+ \d+ obj塊,您還可以添加|@mail替代負向預測,但由於使用了惰性量詞,這是沒有必要的),儘可能少(有關此結構的詳細信息,請參閱this post
  • @mail - 文字串@mail
  • [\s\S]+? - 任何字符,儘可能少
  • endobj - 字面子。

注意,您可以添加多改性劑和添加^(線的開始)和$(線結束)錨在必要時進行匹配更安全和更精確(demo)。