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"
我有一个包含 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"