给出以下;
分隔字符串
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*
我希望获得第一名的完整专线。列不是a
或d
,并且除去了匹配的行,然后用空替换来获得此值
a;; z
d;23
d;23td
a;b;bb;;;34
请参阅demo
在“替换”面板中,有第5个空行,需要将其删除。
过去,我为此目的使用了此\s*\z
。如此处所实现的,它似乎不起作用。
感谢您的任何帮助
我认为您的正则表达式不会删除最后一个换行符的原因是,它是您要保留的最后一部分的末尾的一部分,因此,如果不匹配,则无法删除它。
因此,我重写了正则表达式以匹配您要保留的行,而且还包括匹配之上和之下的所有内容,而不是其他匹配。
关键区别在于,如果要保留的组的换行符后接另一个匹配项,则使用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)
的开头和结尾完全相同,并且匹配所有不需要的东西,以便将其删除。