Regexp- 替换字符串中的特定换行符

Regexp- replace specific line break in String

我正在寻找一个 regexp,它可以从一个长字符串中找到特定的换行符 \n

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

例如:

This tis a fine #line1\nThis tis another fine #line2\nThis_belongs_to abobe line\nThis tis still is OK #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)(?!.*#).*$ 很接近,但我无法弄清楚如何构建正确的正则表达式来匹配和删除正确的换行符并保留剩余 text/String.

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

您可以使用

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

regex demo / regex demo #2详情:

  • (?m) - Pattern.MULTILINE 嵌入标志选项使 $ 在此模式中匹配一行的结尾,而不是整个字符串的结尾
  • \R - 任何换行序列
  • (?!.*#) - 匹配一个位置的否定前瞻,它不立即跟随着换行符以外的任何零个或多个字符,然后是 # char
  • (?=[^\n#]+$) - 除了 LF 和 [=18= 之外,还需要一个或多个字符(将 + 替换为 * 以匹配空行)的正向前瞻] 到一行的末尾。

在线查看Java demo

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