首页 > 解决方案 > 正则表达式 - 替换字符串中的特定换行符

问题描述

我正在寻找一个从长字符串中找到特定换行符的正则表达式。\n

具体\n不包含特定字符的行之前的那个'#'

例如:

这是一个很好的#line1\n这是另一个很好的#line2\nThis_belongs_to abobe line\n这个还是可以的#line4

表示文本:

this tis a fine #line1
this tis another fine #line2
this_belongs_to abobe line
this tis still is OK #line4

这里\n要在#line2 之后的那个中删除,产生以下文本:

this tis a fine #line1
this tis another fine #line2this_belongs_to abobe line
this tis still is OK #line4

我想出了一个正则表达式,例如:\n^(?m)(?!.*#).*$很接近,但我不知道如何构建正确的表达式,使我可以匹配并仅删除正确的换行符并保留剩余的文本/字符串。

也许有比使用正则表达式更好的方法?

标签: javaregexregexp-replace

解决方案


您可以使用

text = text.replaceAll("\\R(?!.*#)", "");
text = text.replaceAll("(?m)\\R(?=[^\n#]+$)", "");

请参阅正则表达式演示/正则表达式演示 #2详情

  • (?m)-在此模式中Pattern.MULTILINE嵌入的标志选项$匹配一行的结尾,而不是整个字符串的结尾
  • \R- 任何换行序列
  • (?!.*#)- 一个负前瞻,它匹配一个不紧跟任何零个或多个字符的位置,而不是尽可能多的换行符,然后是一个#字符
  • (?=[^\n#]+$)- 一个积极的前瞻,它需要一个或多个字符(替换+*也可以匹配空行),而不是 LF,#直到行尾。

在线查看Java 演示

String s_lf = "this tis a fine #line1\nthis tis another fine #line2\nthis_belongs_to abobe line\nthis tis still is OK #line4";
String s_crlf = "this tis a fine #line1\r\nthis tis another fine #line2\r\nthis_belongs_to abobe line\r\nthis tis still is OK #line4";
 
System.out.println(s_lf.replaceAll("\\R(?!.*#)", "")); 
System.out.println(s_crlf.replaceAll("\\R(?!.*#)", ""));
 
System.out.println(s_lf.replaceAll("(?m)\\R(?=[^\n#]+$)", "")); 
System.out.println(s_crlf.replaceAll("(?m)\\R(?=[^\n#]+$)", "")); 

所有测试用例 - 具有 CRLF 和 LF 行结尾的字符串 - 导致

this tis a fine #line1
this tis another fine #line2this_belongs_to abobe line
this tis still is OK #line4

推荐阅读