java - 正则表达式 - 替换字符串中的特定换行符
问题描述
我正在寻找一个从长字符串中找到特定换行符的正则表达式。\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)(?!.*#).*$
很接近,但我不知道如何构建正确的表达式,使我可以匹配并仅删除正确的换行符并保留剩余的文本/字符串。
也许有比使用正则表达式更好的方法?
解决方案
您可以使用
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
推荐阅读
- xml - 使用 XSLT 选择最后一个子元素
- python - Pandas Styler 动态合并单元格与行跨度并显示?
- node.js - 'T' 可以用可能不相关的任意类型实例化
- wordpress - 如何使不存在的图标显示在 wordpress 网站的顶部标题中?
- javascript - 表达式预期和语法错误:Unexpected token jsx nextjs
- php - Laravel 不重置密码。拉拉维尔 8
- python - 对具有共享参数的多个 x,y 数据集使用 curve_fit
- javascript - JS 事件侦听器在项目拖动期间停止工作,仅在指针向上和随后的鼠标移动后触发
- javascript - 每个 id 的值都不匹配
- powerbi - DAX RANKX 返回全 1