Java 用于删除引号之间的 CRLF 的正则表达式

Java regexp to remove CRLF between quotes

我有一个包含 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]+)(.*\",)", " ");

或者只是 ([\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());

使用 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