1

ディレクトリパスを次から変換したい:

C:\Users\Host\Desktop\picture.jpg

C:\\Users\\Host\\Desktop\\picture.jpg

replaceAll() 関数やその他の置換関数を使用していますが、機能しません。

これどうやってするの?

私は声明を印刷しました。それは私が欲しかったもの、つまり C:\Users\Host\Desktop\picture.jpg を与えてくれますが、この変数を渡してファイルを開くと、なぜこの例外が発生するのですか?

java.io.FileNotFoundException: C:\Users\Host\Desktop\picture.jpg

4

4 に答える 4

6

編集:からreplaceAllに変更されましたreplace-ここでは正規表現は必要ないので、使用しないでください。(これは、Java APIチームであるIMO側の設計上の決定としては非常に貧弱でした。)

私の推測では(十分な情報を提供していないので)、次のようなことをしていると思います。

text.replace("\\", "\\\\");

Javaでは文字列は不変であるため、戻り値を使用する必要があります。

String newText = oldText.replace("\\", "\\\\");

それでも質問に答えられない場合は、詳細情報を提供してください。

通常、これを自分で行うべきではないこともお勧めします。これがJSON応答のようなものに情報を含める場合は、より広いライブラリがエスケープを実行することを期待します。)

\Java文字列(および文字)リテラルのエスケープ文字と同様に、2倍にする必要があることに注意してください。replace入力を正規表現パターンとして扱わないため、とは異なり、さらに2倍にする必要がないことに注意してくださいreplaceAll

編集:二重の円記号が含まれるファイル名がないFileNotFoundExceptionため、現在取得しています-何があったと思いましたか?有効なファイル名にしたい場合、なぜ円記号を2倍にするのですか?

于 2012-02-03T15:50:41.033 に答える
5

使用する必要があります:

String t2 = t1.replaceAll("\\\\", "\\\\\\\\");

または(パターンなし):

String t2 = t1.replace("\\", "\\\\");

各「\」の前に別の「\」を付ける必要があります。ただし、前の「\」にも当てはまるため、正規表現でバックスラッシュが必要になるたびに、4 つのバックスラッシュを記述する必要があります。

于 2012-02-03T15:56:33.970 に答える
0

2 つの説明:

1.二重のバックスラッシュを1つに置き換えます(あなたが求めたものではありません)

バックスラッシュをバックスラッシュでエスケープする必要があります。このような:

String newPath = oldPath.replaceAll("\\\\\\\\", "\\");

最初のパラメーターは 2 回エスケープする必要があります。1 回は Java コンパイラ用で、もう 1 回は正規表現を使用するためです。したがって、2 つのバックスラッシュを 1 つに置き換えます。したがって、バックスラッシュをエスケープする必要があるため、バックスラッシュを 1 つ追加します。今、あなたは持ってい\\ます。これは にコンパイルされ\ます。しかし!!replaceAll メソッドの最初のパラメーターは正規表現を使用するため、バックスラッシュをもう一度エスケープする必要があります。エスケープするには、バックスラッシュを追加しますが、そのバックスラッシュはエスケープする必要があるため、\\\\. これらのバックスラッシュは、正規表現の 1 つのバックスラッシュを表します。しかし、二重のバックスラッシュを 1 つに置き換えたいとします。したがって、8 つのバックスラッシュを使用します。

replaceAll メソッドの 2 番目のパラメーターは正規表現を使用していませんが、同様にエスケープする必要があります。そのため、Java コンパイラ用に 1 回、replace メソッド用に 1 回エスケープする必要があります\\\\。これは 2 つのバックスラッシュにコンパイルされ、replaceAll メソッドでは 1 つのバックスラッシュとして解釈されます。

2.単一のバックスラッシュをバックスラッシュのペアに置き換えます(あなたが求めたもの)

String newPath = oldPath.replaceAll("\\\\", "\\\\\\\\");

上記と同じロジック。

3.replace()の代わりに使用しreplaceAll()ます。

String newPath = oldPath.replace("\\", "\\\\");

違いは、このreplace()メソッドは正規表現を使用しないため、最初のパラメーターですべてのバックスラッシュを 2 回エスケープする必要がないことです。

うまく説明できればいいのですが…

-- 編集: xehpuk が指摘したエラーを修正 --

于 2012-02-03T15:57:39.883 に答える
0

文字列では \ がデフォルトでエスケープ文字として使用されるため、文字列で "\" を選択するには "\" を使用する必要があり、"\" (つまり 2 回のブラックスラック) には "\\" を使用する必要があります。これはあなたの問題を解決し、「」のような他のシンボルにも適用されます

于 2012-02-03T15:56:15.383 に答える