regex 尝试消除行尾白色,然后通过消除(\2)合并(\1)和(\3)(CR/LF)

46qrfjad  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(130)

试图把下面的线条
第1组:Ltm::.....,直到文本行结束。
第2组:第1组之后的空白/CR/LF,直至第3组
第3组:Availability : available或任何状态。
数据来源:

Ltm::Virtual Server: dmz.abc.com_443  
  Availability     : available  
Ltm::Virtual Server: dmztest.abc.com_80  
  Availability     : unknown     
Ltm::Virtual Server: dmztest.abc.com_443  
  Availability     : available   
Ltm::Virtual Server: lop.abc.com_80  
  Availability     : unknown     
Ltm::Virtual Server: lop.abc.com_443  
  Availability     : available

我的搜索是这样的:

(Ltm::.*_.*\s)(\r\n|\N)(\s.*$)

我的替代品是(\1)(\3),它有效地(我认为)将消除我的第2组匹配的所有垃圾隐藏的CR/LF

u3r8eeie

u3r8eeie1#

这实际上取决于你使用的编辑器。你说你使用这个正则表达式:
(Ltm::.*_.*\s)(\r\n|\N)(\s.*$)
但是当处理多行时,特殊的^和$仍然在每行的开始/结束处停止。
如果你想识别匹配字符串的开始和结束,你应该使用\A(字符串的开始)和\Z(字符串的结束)。

^\s*(Ltm::.*)\s*(\n)$^(\s|\r|\n)*(Availability.*)\s*(\n)$

这将匹配列表中的一个示例
如果您搜索并将每个示例替换为\1\2\4\5,它将清除不可见的“垃圾”。
如果您怀疑其他地方有垃圾邮件,请将\s* 替换为(\s|\r|\n)* 以确保它也被删除。注意行尾之前的(\n)组,您需要保留此换行符,因为在多行中\s也匹配\n。

vaqhlq81

vaqhlq812#

我推荐这个模式:

(Ltm:.*)\s*\r?\n\s*(Availability.+)

说明:
(...)-在捕获组中存储匹配的文本
.*-匹配零个或多个任意字符(除换行符外)
\s*-匹配零个或多个空格
\r?-匹配0或1个回车
\n-匹配换行符
这里你可以选择匹配回车符,然后它可以同时匹配LF和CRLF。
最后,将其替换为第一和第二捕获组:$1$2
Regex demo

编辑

正如AdrianHHH在注解中所建议的那样,在Notepad中,您可以使用\R匹配任何带或不带回车的换行符;请参阅Notepad用户手册。

bbmckpt7

bbmckpt73#

您的示例数据每行后至少有2个“空格”,您的模式将有以下匹配:

  • (Ltm::.*_.*\s)捕获组1,这部分匹配整行,由于\s也可以匹配换行符,因此也会匹配换行符
  • (\r\n|\N)捕获组2,由于\N匹配任何非换行符字符,因此此部分将匹配下一行的第一个空白字符
  • (\s.*$)捕获组3,此部分将匹配下一行的第二个空格,然后是该行的其余部分

因此,如果替换为\1\3,则仍有在组1中捕获的换行符,而将省略的部分是\N匹配的单个非换行符
一个可能的解决方案可能是:

查找内容:

^(\h*Ltm::.*_\d+)\h*\R\h*(\h.*\S)\h*

替换为:

\1\2

或者,如果你想使用Notepad++在替换中保留括号,你必须转义它们:

\(\1\)\(\2\)

图案吻合

  • ^字符串开头
  • (\h*Ltm::.*_\d+)捕获组1,匹配可选的前导水平空白字符,然后Ltm::然后.*将匹配行的其余部分,后面是最后一个出现的_和1+数字
  • \h*\R\h*匹配任何由可选水平空格字符包围的Unicode换行符序列
  • (\h.*\S)捕获组2,匹配单个水平空白字符,行的其余部分,然后是最后一个非空白字符
  • \h*匹配可选的尾随水平空格字符

请参见regex demo

相关问题