您可以使用简单的"[^"]*" 正则表达式匹配双引号之间的所有子字符串,并删除使用之间的所有换行符
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 选项,它将允许. 匹配换行符。
详情:
-
" - 一个 " 字符
-
[^"\\]* - 除了 " 和 \ 字符之外的零个或多个字符
-
(?:\\.[^"\\]*)* - \ 的零个或多个序列及其后的任何字符后跟零个或多个字符,而不是 " 和 \ 字符
-
" - " 字符。