2017-06-28 58 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)。