Regex删除最后一个换行符

问题描述 投票:1回答:1

给出以下;分隔字符串


a;; z
toy;d;hh 
toy
;b;;jj
z;
d;23
d;23td
;;io;
b y;b;12
z
a;b;bb;;;34
z

和此正则表达式

^(?!(?:(a|d))(?:;|$)).*(\s*\z|$)\R*

我希望获得第一名的完整专线。列不是ad,并且除去了匹配的行,然后用空替换来获得此值

a;; z
d;23
d;23td
a;b;bb;;;34

请参阅demo

在“替换”面板中,有第5个空行,需要将其删除。

过去,我为此目的使用了此\s*\z。如此处所实现的,它似乎不起作用。

感谢您的任何帮助

regex newline pcre
1个回答
0
投票

我认为您的正则表达式不会删除最后一个换行符的原因是,它是您要保留的最后一部分的末尾的一部分,因此,如果不匹配,则无法删除它。

因此,我重写了正则表达式以匹配您要保留的行,而且还包括匹配之上和之下的所有内容,而不是其他匹配。

关键区别在于,如果要保留的组的换行符后接另一个匹配项,则使用conditional仅匹配该组的换行符。

正则表达式:

((?!(a|d)).*(\s*\z|$)\R*)*(^(a|d).*(?(?=\R*(.*\s*\R+)*(a|b))\R))((?!(a|d)).*(\s*\z|$)\R*)*

替换为$4->

a;; z
d;23
d;23td
a;b;bb;;;34

出于可读性考虑,我删除了您拥有的一些非捕获和字符串分隔符逻辑,如果有必要,可以将它们重新添加。

各部分的逻辑分解:

[(?(?=\R*(.*\s*\R+)*(a|b))\R)是有条件的,如果\R后跟(?)任何以换行符结尾的不匹配行(?=),则仅匹配换行(.*\s*\R+)*

包含它的中间部分(a|b)最终作为替换匹配项(^(a|d).*(?(?=\R*(.*\s*\R+)*(a|b))\R))。因此,它匹配以$4开头的行,除最后一个匹配项之外的所有匹配项也都在其行尾匹配换行符。

正则表达式(a|d)的开头和结尾完全相同,并且匹配所有不需要的东西,以便将其删除。

© www.soinside.com 2019 - 2024. All rights reserved.