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);

コンソールに入力した \r\n を、実際には \ と r ではなく、行区切り記号として Java に処理してもらいたいのです。現在は、入力をそのまま出力しています。

望ましい出力:

abc

abc

abc

更新:試しinput = StringEscapeUtils.unescapeJava(input);てみたところ、問題は解決しました。

4

5 に答える 5

5

Java で正規表現をダブルエスケープする必要があります (正規表現のバックスラッシュに対して 1 回、Java 文字列に対して 1 回)。改行 ( /\n/, "\\n") は必要ありませんが、バックスラッシュ ( /\\/) と "n": /\\n/, "\\\\n". したがって、これは機能するはずです:

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

エスケープ シーケンスのより広範な処理については、Java で 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

r0dneyが言及したように、Bergiのソリューションは機能しません。

一部のサードパーティライブラリを使用する機能は優れていますが、すべての問題にサードパーティライブラリが存在するわけではないため、研究者にとっては理論を理解することをお勧めします。

1行のコードで解決できるタスクのために大量のサードパーティライブラリでプロジェクトをオーバーロードすると、プロジェクトがかさばり、保守が容易になりません。とにかくここで機能しているものです:

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

一貫した動作を実現するには、システムごとに動作が異なるため、\\ r \\ nを改行に置き換えるのではなく、\\rを\rに、\\nを\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 に答える
0

\ と r と \ と n を実際にコンソールに入力しない限り、これを行う必要はまったくありません。代わりに、重大な誤解があります。CR 文字は文字列では \r として表されますが、16 進値 0xD を持つ 1 バイトのみで構成されます。また、コンソールにバックスラッシュを入力している場合、単純な答えは「しない」です。Enter キーを押すだけです。それが目的です。CR バイトをコードに送信します。

于 2012-07-18T23:06:12.983 に答える