我正在编写代码,该代码应该从文本块中删除实际的换行符,并用字符串“\ n”替换它们。然后,当在另一个时间读取String时,它应该替换换行符(换句话说,搜索所有“\ n”并插入\n
。但是,虽然第一次转换工作正常,但它没有执行似乎第二个替代品什么都不做。为什么?
替换:
theString.replaceAll(Constants.LINE_BREAK, Constants.LINE_BREAK_DB_REPLACEMENT);
重新替换:
theString.replaceAll(Constants.LINE_BREAK_DB_REPLACEMENT, Constants.LINE_BREAK);
常数:
public static final String LINE_BREAK = "\n";
public static final String LINE_BREAK_DB_REPLACEMENT = "\\\\n";
答案 0 :(得分:1)
在最后一次replaceAll()方法调用中,您不需要四个反斜杠。 这似乎对我很好
String str = "abc\nefg\nhijklm";
String newStr = str.replaceAll("\n", "\\\\n");
String newnewStr = newStr.replaceAll("\\\\n", "\n");
输出结果为:
ABC
EFG
hijklm
ABC \ nefg \ nhijklm
ABC
EFG
hijklm
我认为这就是你所期望的。
答案 1 :(得分:1)
在String.replaceAll(regex, replacement)
中,正则表达式字符串和替换字符串都将反斜杠视为转义字符:
regex
代表regular expression,它以\\
replacement
是一个替换字符串,它也会转义反斜杠:请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;见Matcher.replaceAll。
这意味着必须在两个参数中转义反斜杠。此外,字符串常量也使用反斜杠作为转义字符,因此传递给方法的字符串常量中的反斜杠必须进行双重转义(另请参阅this question)。
这对我来说很好用:
// Replace newline with "\n"
theString.replaceAll("\\n", "\\\\n");
// Replace "\n" with newline
theString.replaceAll("\\\\n","\n");
您还可以使用Matcher.quoteReplacement()
方法将替换字符串视为文字:
// Replace newline with "\n"
theString.replaceAll("\\n", Matcher.quoteReplacement("\\n"));
// Replace "\n" with newline
theString.replaceAll("\\\\n",Matcher.quoteReplacement("\n"));