我有一些文本,如下所示:
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
(e.g. 12 13 obj
)到它们结束的点endobj
其中它们包含特定的字符串,在本例中为@mail
。不过,我在为此找到合适的正则表达式时遇到了一些麻烦。
我能够成功选择每个块(\d+\ \d+\ obj[\s\S]+?endobj)
请参阅此处的测试:https://regex101.com/r/V4WAMl/5
但我无法让它按我想要的方式工作(\d+\ \d+\ obj[\s\S]+?@mail[\s\S]+?endobj)
请参阅此处的测试:https://regex101.com/r/V4WAMl/4
我知道为什么会发生这种情况,但我不太确定如何解决它。我的理论是惰性修饰符是贪婪的,因为它最初不匹配,所以它停止在下一个匹配的修饰符处。我尝试了各种排除的组合^(?:*****)
,但当我尝试时,这些似乎与任何内容都不匹配。
使用以下解决方案:
\d+ \d+ obj(?:(?!\d+ \d+ obj)[\s\S])*?@mail[\s\S]*?endobj
^^^^^^^^^^^^^^^^^^^^^^^^^^^
See the 正则表达式演示
这里的要点是你需要匹配一个starting_delimiter
,然后任何 char,0+ 出现次数尽可能少,不会启动starting_delimiter
模式,然后匹配所需的模式,然后匹配尽可能少的任何 0+ 字符,直到trailing_pattern
:
<START>(?:(?!<START>)[\s\S])*?<WORD>[\s\S]*?<END>
Details:
-
\d+ \d+ obj
- 1 位或更多数字、空格、1+ 位数字、obj
-
(?:(?!\d+ \d+ obj)[\s\S])*?
- 任何字符([\s\S]
)这不是一个起点\d+ \d+ obj
序列(因此,正则表达式引擎将无法溢出到下一个\d+ \d+ obj
块,您还可以添加一个|@mail
负向前瞻的替代方案,但由于使用了惰性量词,因此没有必要),尽可能少(有关此构造的更多详细信息,请参阅这个帖子)
-
@mail
- 文字子串@mail
-
[\s\S]*?
- 任何 0+ 个字符,尽可能少
-
endobj
- 文字子串。
Note您可以添加多行修饰符并添加^
(一行的开头)和$
(行尾)在必要时进行锚点以使匹配更安全、更精确(demo).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)