首页 > 解决方案 > Java:如何删除双引号之间的所有换行符

问题描述

我有一个用 Java 解析的大 CSV 文件。问题是,在一些标有“”的文本部分中,我有换行符。我现在正在尝试删除“”部分中的所有换行符,但到目前为止还没有成功。

例如,我有以下 CSV:

"Test Line wo line break"; "Test Line 
with line break"
"Test Line2 wo line break"; "Test Line2 
with line break"

结果应该是:

"Test Line wo line break"; "Test Line with line break"
"Test Line2 wo line break"; "Test Line2 with line break"

到目前为止,我已经尝试了以下方法:

s.replaceAll("(\\w)*\r\n", "$1");

但是,不幸的是,这取代了所有换行符,也是行尾的换行符。

然后我在正则表达式中添加了双撇号:

s.replaceAll("\"(\\w)*\r\n\"", "$1");

但不幸的是,有了这个,根本没有任何东西可以替代。

你能帮我找出我在这里做错了什么吗?

提前致谢

标签: javaregex

解决方案


您可以使用简单的正则表达式匹配双引号之间的所有子字符串,"[^"]*"并删除使用之间的所有换行符

String s = "\"Test Line wo line break\"; \"Test Line \nwith line break\"\n\"Test Line2 wo line break\"; \"Test Line2 \nwith line break\"";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\"[^\"]*\"").matcher(s);
while (m.find()) {
    m.appendReplacement(result, m.group().replaceAll("\\R+", ""));
}
m.appendTail(result);
System.out.println(result.toString());

或者,从 Java 9+ 开始,您可以使用更短的代码:

String s = "\"Test Line wo line break\"; \"Test Line \nwith line break\"\n\"Test Line2 wo line break\"; \"Test Line2 \nwith line break\"";
Matcher m = Pattern.compile("\"[^\"]*\"").matcher(s);
s = m.replaceAll(r -> m.group().replaceAll("\\R+", ""));
System.out.println(s);

输出:

"Test Line wo line break"; "Test Line with line break"
"Test Line2 wo line break"; "Test Line2 with line break"

请参阅在线 Java 演示/ Java 代码演示 #2

请注意,.replaceAll("\\R+", "")找到 1 个或多个任何换行符序列并仅从"[^"]*"匹配的内容中删除它们。

双引号之间的转义序列支持

如果双引号之间的字符串可以包含转义序列,则需要使用不同的模式:

Pattern.compile("\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"", Pattern.DOTALL)

请注意该Pattern.DOTALL选项,它将允许.匹配换行符。

详情

  • "- 一个"字符
  • [^"\\]*"- 除了和字符之外的零个或多个\字符
  • (?:\\.[^"\\]*)*- 零个或多个 a 序列\和它之后的任何字符,然后是零个或多个字符,而不是"\字符
  • "- 一个"字符。

推荐阅读