【发布时间】: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