为什么在删除它们之后重新插入换行符不起作用?

时间:2012-11-06 20:44:53

标签: java regex string replace

我正在编写代码,该代码应该从文本块中删除实际的换行符,并用字符串“\ 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";

2 个答案:

答案 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"));