java - 用\ n替换换行符

时间:2018-06-05 14:10:12

标签: java

我正在编写IDE。假设我在字符串上有Hello, World Pascal程序:

String sourceCode = "program Hello;\nbegin\nwriteln ('Hello, world.');\nend.";

如果我System.out.println(sourceCode);输出显示:

program Hello;
begin
writeln ('Hello, world.');
end.

很好,但我想将新行显示为\n。我试过了:

sourceCode = sourceCode.replaceAll(System.lineSeparator(), "\\n");

然后System.out.println(sourceCode);输出:

program Hello;nbeginnwriteln ('Hello, world.');nend.

当我期望显示\n时:

program Hello;\nbegin\nwriteln ('Hello, world.');\nend.

我怎样才能实现这一目标?完整演示:

public class PrintPascalHelloWorld {
    public static void main(String[] args) {
        String sourceCode = "program Hello;\nbegin\nwriteln ('Hello, world.');\nend.";
        System.out.println(sourceCode);
        sourceCode = sourceCode.replaceAll(System.lineSeparator(), "\\n");
        System.out.println(sourceCode);
    }
}

我可以使用Online Java IDE编译并运行它。

4 个答案:

答案 0 :(得分:4)

您使用String.replaceAll(String regex, String replacement)作为第一个参数String regex,第二个参数String replacement。 此方法对替换String有一些特殊性。特别是,如果它包含\$,则可能不会将其解释为文字。

根据Matcher.replaceAll()引用的String.replaceAll()指定:

  

请注意替换中的反斜杠()和美元符号($)   字符串可能会导致结果与正确的结果不同   作为文字替换字符串处理。可以对待美元符号   作为对如上所述的捕获的子序列的引用,和   反斜杠用于替换替换中的文字字符   串

在您的情况下,sourceCode.replaceAll(System.lineSeparator(), "\\n")将转义文字n字符。

如果您想使用replaceAll(),则应使用复杂的方式,例如:

sourceCode = sourceCode.replaceAll("\n", "\\\\n");

由于您不需要使用正则表达式,因此使用String.replace(CharSequence target, CharSequence replacement)替换另一个CharSequence更有意义,String是{{1}的实例1}}。
所以你可以调用:

CharSequence

现在sourceCode = sourceCode.replace("\n", "\\n") 作为文字处理。

另请注意,当您在文件输出流中写入时,String replacement有意义,因为新行字符不可避免地取决于操作系统。
System.lineSeparator()中包含的\n行结尾(例如String)不依赖于操作系统。

例如,在Windows上,当您在标准输出中打印时,JVM 8会无差别地处理Windows新行字符("program Hello;\nbegin\nwriteln ('Hello, world.');\nend.";)和\r\n

Windows上的此代码:

\n

确实产生了:

  

程序你好;

     

开始

     

writeln(' Hello,world。');

     

端。

答案 1 :(得分:3)

由于System.lineSeparator()取决于平台,因此根据文档:

  

在UNIX系统上,它返回“\ n”;在Microsoft Windows系统上,它返回“\ r \ n”。

最好直接使用\n

String sourceCode = "program Hello;\nbegin\nwriteln ('Hello, world.');\nend.";
System.out.println(sourceCode);
sourceCode = sourceCode.replaceAll("\n", "\\\\n");
System.out.println(sourceCode);

将显示:

program Hello;
begin
writeln ('Hello, world.');
end.
program Hello;\nbegin\nwriteln ('Hello, world.');\nend.

答案 2 :(得分:3)

除非您尝试使用正则表达式,否则不需要使用replaceAllreplace工作正常。

sourceCode = sourceCode.replace("\n", "\\n");

答案 3 :(得分:0)

如果您在Windows机器上测试代码,那肯定会失败。正如

System.lineSeparator()

将返回" \ r \ n"在窗户上。并且它不匹配" \ n"来自你的输入字符串。

您需要更改为以下代码

sourceCode = sourceCode.replaceAll("\n", "\\\\n");