【问题标题】:Java regexp to remove CRLF between quotesJava正则表达式删除引号之间的CRLF
【发布时间】:2022-01-27 16:49:39
【问题描述】:

我有一个包含 CSV 行的字符串。它的一些值包含CRLF 字符,在下面的示例中标记为[CRLF]

注意:第 1 行:和第 2 行:不是 CSV 的一部分,仅供讨论

Line 1: 
foo1,bar1,"john[CRLF]
dose[CRLF]
blah[CRLF]
blah",harry,potter[CRLF]
Line 2:
foo2,bar2,john,dose,blah,blah,harry,potter[CRLF]

每当一行中的一个值有一个 CRLF 时,整个值就会出现在引号之间,如第 1 行所示。寻找一种方法来解决出现在引号之间的那些 CRLF。

尝试过的正则表达式,例如:

data.replaceAll("(,\".*)([\r\n]+|[\n\r]+)(.*\",)", "$1 $3");

或者只是([\r\n]+)\n+等没有成功:该行继续显示,好像没有进行替换。

编辑:

解决方案

找到解决方案here:

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

【问题讨论】:

  • 也可以有转义或不平衡的引号吗?
  • 确实如此。使用部分解决方案编辑我的帖子,突出显示您提到的案例
  • 嗯,引号之间的 CRLF 是您的问题标题,但现在您正在尝试解决 CRLF 不在引号内的问题

标签: regex csv java-11 carriage-return linefeed


【解决方案1】:

使用 Java 9+,您可以在 Matcher#replaceAll 中使用函数代码并使用此代码解决您的问题:

// pattern that captures quoted strings ignoring all escaped quotes
Pattern p = Pattern.compile("\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"");

String data1 = "\"Test Line wo line break\", \"Test Line \nwith line break\"\n\"Test Line2 wo line break\", \"Test Line2 \nwith line break\"\n";

// functional code to get all quotes strings and then remove all line 
// breaks from matched substrings
String repl = p.matcher(data1).replaceAll(
   m -> m.group().replaceAll("\\R+", "")
);

System.out.println(repl);

输出:

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

Code Demo

【讨论】:

  • 谢谢。它与我同时在我的 OP 中添加的答案同样有效。标记回答并赞成。只是字符串缓冲区,但你的答案解决了问题,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2023-04-09
  • 2016-01-24
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多