Regex 如何通过正则表达式删除包含特定短语的文本块

Regex 如何通过正则表达式删除包含特定短语的文本块,regex,Regex,我有一些文字,看起来像这样: 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 12对象 > endobj 12 13 obj > en

我有一些文字,看起来像这样:

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
12对象
>
endobj
12 13 obj
>
endobj
11 12 obj
>
endobj
我想删除任何文本块,从
/d+/d+obj
(例如
12 13 obj
)开始,直到它们结束于
endobj
,其中包含一个特定的字符串,在本例中,该字符串将是
@mail
。不过,我很难找到合适的正则表达式

我能够使用
(\d+\\d+\obj[\s\s]+?endobj)
请参见此处的测试:

但是我无法按照我的意愿使其正常工作
(\d++\\d++\obj[\s\s]+?@mail[\s\s]+?endobj)
请参见此处的测试:


我知道为什么会发生这种情况,但我真的不知道如何解决它。我的理论是,懒惰修饰符是贪婪的,因为它最初不匹配,所以它会在下一个匹配的修饰符处停止。我尝试了各种排除项的组合,但这些排除项在我尝试时似乎不匹配。

使用以下解决方案:

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

这里的要点是,您需要匹配一个
起始定界符
,然后匹配任何不启动
起始定界符
模式的字符,0+出现次数,尽可能少,然后匹配所需的模式,然后匹配任何0+字符,直到
尾随定界符模式

<START>(?:(?!<START>)[\s\S])*?<WORD>[\s\S]*?<END>
(?:(?!)[\s\s])*?[\s\s]*?
详细信息

  • \d+\d+obj
    -1个或多个数字、空格、1+个数字,
    obj
  • (?:(?!\d+\d+obj)[\s\s])*?
    -不是
    \d+\d+obj
    序列起点的任何字符(
    [\s\s]
    )(因此,正则表达式引擎将无法溢出到下一个
    \d+\d+obj
    块,您也可以添加一个
    |@mail
    替代负前瞻,但由于使用了惰性量词,因此不需要),尽可能少(有关此构造的更多详细信息,请参阅)
  • @mail
    -文字子字符串
    @mail
  • [\s\s]*?
    -任何0+字符,尽可能少
  • endobj
    -文字子字符串

注意您可以添加一个多行修饰符,并在必要时添加
^
(行首)和
$
(行尾)锚定,以使匹配更安全、更精确()。

我有一个非常类似的方法,并提出了(更简单)正则表达式:
^\d+\d+obj.*searchstring.*endobj$
。但是,你的正则表达式肯定更全面。但是我看到你的正则表达式,就像我的正则表达式一样,正在用一个空行替换结果。我希望它用没有空行的字符串替换找到的字符串。这怎么能实现?@GeertVc正则表达式不替换,它只匹配。什么我相信,您需要的不在OP问题的范围内。如果您需要删除换行符,请匹配它。