如何将“\\ r \\ n”更改为java中的行分隔符

时间:2012-07-18 16:34:20

标签: java regex newline terminal-emulator

我正在开发一个学校项目来构建一个伪终端和文件系统。终端正在扫描System.in并将字符串传递给控制器​​。

输入到控制台:abc\r\nabc\r\nabc

这是我试过的代码

Scanner systemIn = Scanner(System.in);
input = systemIn.nextLine();
input = input.replaceAll("\\\\r\\\\n",System.getProperty("line.separator"));
System.out.print(input);

我希望java将\ r \ n我键入的控制台视为行分隔符,而不是实际的\和r。 现在它做的是按原样打印输入。

所需的输出:

ABC

ABC

ABC

更新:我尝试了input = StringEscapeUtils.unescapeJava(input);并解决了问题。

5 个答案:

答案 0 :(得分:5)

你需要在java中双重转义正则表达式(一次用于正则表达式反斜杠,一次用于Java字符串)。您不希望换行(/\n/"\\n"),但需要反斜杠(/\\/)加上“n”:/\\n/"\\\\n"。所以这应该有效:

input.replaceAll("(\\\\r)?\\\\n", System.getProperty("line.separator"));

有关转义序列的更广泛处理,请参阅How to unescape a Java string literal in Java?

答案 1 :(得分:2)

如果您的输入包含字符串'\ r \ n',请尝试使用

Scanner systemIn = Scanner(System.in);
input = systemIn.nextLine();
input = input.replaceAll("\\\\r\\\\n",System.getProperty("line.separator"))

答案 2 :(得分:1)

为了保持一致的行为,我将\\ r替换为\ r和\\ n用\ n而不是用换行符替换\\ r \\ n,因为这会在不同的系统上有不同的行为。

你可以做到

input = systemIn.nextLine().replaceAll("\\\\r", "\r").replaceAll("\\\\n", "\n");

nextLine()末尾的换行符。如果要添加行分隔符,可以执行

input = systemIn.nextLine() + System.getProperty("line.separator");

如果您使用println(),则无需将其添加回来。

System.out.println(systemIn.nextLine()); // prints a new line.

答案 3 :(得分:1)

正如r0dney所提到的,Bergi的解决方案不起作用。

使用某些第三方库的能力是好的,但对于研究它的人来说,更好地了解该理论,因为并非每个问题都存在于某些第三方库中。

带有大量第三方库的重载项目可以在一行代码中解决任务,这使得项目体积庞大且不易维护。无论如何,这是有效的:

content.replaceAll("(\\\\r)?\\\\n", System.getProperty("line.separator"));

答案 4 :(得分:0)

除非你实际上在控制台中输入\和r和\和n,否则根本不需要这样做:相反,你有一个重大的误解。 CR字符以字符串表示为\ r \ n,但它只包含一个十六进制值为0xD的字节。如果你在控制台中键入反斜杠,那么简单的答案是“不要”。只需点击Enter键:这就是它的用途。它会将CR字节传输到您的代码中。