1

我正在做一个学校项目来构建一个伪终端和文件系统。终端正在扫描 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。它现在所做的是按原样打印输入。

期望的输出:

美国广播公司

美国广播公司

美国广播公司

更新:我试过input = StringEscapeUtils.unescapeJava(input);了,它解决了这个问题。

4

5 回答 5

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?

于 2012-07-18T16:42:53.027 回答
2

如果您的输入有字符串 '\r\n',试试这个

Scanner systemIn = Scanner(System.in);
input = systemIn.nextLine();
input = input.replaceAll("\\\\r\\\\n",System.getProperty("line.separator"))
于 2012-07-18T16:43:55.250 回答
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.
于 2012-07-18T16:37:18.817 回答
1

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

使用一些 3rd 方库的能力很好,但是对于学习的人来说最好了解理论,因为并不是每个问题都存在一些 3rd 方库。

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

content.replaceAll("(\\\\r)?\\\\n", System.getProperty("line.separator"));
于 2013-01-13T22:01:26.223 回答
0

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

于 2012-07-18T23:06:12.983 回答