我正在编写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编译并运行它。
答案 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)
除非您尝试使用正则表达式,否则不需要使用replaceAll
。 replace
工作正常。
sourceCode = sourceCode.replace("\n", "\\n");
答案 3 :(得分:0)
如果您在Windows机器上测试代码,那肯定会失败。正如
System.lineSeparator()
将返回" \ r \ n"在窗户上。并且它不匹配" \ n"来自你的输入字符串。
您需要更改为以下代码
sourceCode = sourceCode.replaceAll("\n", "\\\\n");