首页 > 解决方案 > java - 用\n替换换行符

问题描述

我正在编写一个 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编译和运行它。

标签: java

解决方案


您使用String.replaceAll(String regex, String replacement)它作为第一个参数 aString regex和第二个参数 a String replacement
这种方法有一些关于替换的特殊性String。特别是,如果它包含 a\或 a $,它可能不会被解释为文字。

根据 Matcher.replaceAll()引擎盖下使用的指定String.replaceAll()

请注意,替换字符串中的反斜杠 () 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可以被视为对捕获的子序列的引用,并且 反斜杠用于转义替换字符串中的文字字符

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

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

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

由于您不需要使用正则表达式,因此使用String.replace(CharSequence target, CharSequence replacement)将 a 替换为CharSequence另一个并且StringCharSequence.
所以你可以调用:

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

现在将String replacement其作为文字处理。


另请注意,System.lineSeparator()当您在文件输出流中写入新行字符不可避免地依赖于操作系统时,这很有意义。as 中包含的行尾
不依赖于操作系统。 \nString"program Hello;\nbegin\nwriteln ('Hello, world.');\nend.";

例如在 Windows 上,JVM 8 处理 Windows 换行符 ( \r\n) 并\n在标准输出中打印它们时漠不关心。

此代码在 Windows 上:

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

确实产生:

程序你好;

开始

writeln ('你好,世界。');

结尾。


推荐阅读