【问题标题】:Java: How to remove all line breaks between double quotesJava:如何删除双引号之间的所有换行符
【发布时间】:2019-06-16 18:43:38
【问题描述】:

我有一个用 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");

但是不幸的是,没有任何东西可以替代。

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

提前致谢

【问题讨论】:

  • 会有不止一个换行符吗?

标签: java regex


【解决方案1】:

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

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 demo online/Java code demo #2

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

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

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

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

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

详情

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

【讨论】:

    【解决方案2】:

    如果可以避免,我不建议您自己解析 CVS。通常,解析原始文本通常会变得很麻烦,因为您需要处理各种异常,例如,您很容易达到正则表达式不够用并且需要能够解析上下文无关语法的地步。

    这里有一些用于解析 CSV 的库选项:CSV parsing in Java - working example..?

    【讨论】:

      猜你喜欢
      • 2019-10-20
      • 2021-07-03
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多