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]*?
详细信息:
-1个或多个数字、空格、1+个数字,\d+\d+obj
obj
-不是(?:(?!\d+\d+obj)[\s\s])*?
序列起点的任何字符(\d+\d+obj
)(因此,正则表达式引擎将无法溢出到下一个[\s\s]
块,您也可以添加一个\d+\d+obj
替代负前瞻,但由于使用了惰性量词,因此不需要),尽可能少(有关此构造的更多详细信息,请参阅)|@mail
-文字子字符串@mail
@mail
-任何0+字符,尽可能少[\s\s]*?
-文字子字符串endobj
注意您可以添加一个多行修饰符,并在必要时添加
^
(行首)和$
(行尾)锚定,以使匹配更安全、更精确()。我有一个非常类似的方法,并提出了(更简单)正则表达式:^\d+\d+obj.*searchstring.*endobj$
。但是,你的正则表达式肯定更全面。但是我看到你的正则表达式,就像我的正则表达式一样,正在用一个空行替换结果。我希望它用没有空行的字符串替换找到的字符串。这怎么能实现?@GeertVc正则表达式不替换,它只匹配。什么我相信,您需要的不在OP问题的范围内。如果您需要删除换行符,请匹配它。