String.replaceAll (...) Java не работает для \\ и \ - PullRequest
1 голос
/ 03 февраля 2012

Я хочу преобразовать путь к каталогу из:

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

до

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

Я использую функцию replaceAll () и другие функции замены, но они не работают.

Как я могу это сделать?

Я напечатал заявление, оно дает мне то, что я хотел, т.е. C: \ Users \ хост \ Desktop \ picture.jpg но теперь, когда я передаю эту переменную, чтобы открыть файл, я получаю это исключение, почему?

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

Ответы [ 4 ]

6 голосов
/ 03 февраля 2012

EDIT: изменено с replaceAll на replace - здесь вам не нужно регулярное выражение, поэтому не используйте его. (Это было действительно плохое дизайнерское решение со стороны команды Java API, IMO.)

Мой думаю, (поскольку вы не предоставили достаточно информации), это то, что вы делаете что-то вроде:

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

Строки являются неизменяемыми в Java, поэтому вам нужно использовать возвращаемое значение, например,

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

Если это не отвечает на ваш вопрос, пожалуйста, предоставьте дополнительную информацию.

(я бы также предположил, что обычно вы все равно не должны делать это самостоятельно - если это будет включать информацию в нечто вроде ответа JSON, я бы ожидал, что более широкая библиотека убегаю за тобой.)

Обратите внимание, что требуется удвоение, поскольку \ является escape-символом для строковых (и символьных) литералов Java. Обратите внимание, что, поскольку replace не обрабатывает входные данные как шаблоны регулярных выражений, нет необходимости выполнять дополнительное удвоение, в отличие от replaceAll.

РЕДАКТИРОВАТЬ: Теперь вы получаете FileNotFoundException, потому что не имя файла с двойной обратной косой чертой в - что заставило вас думать, что это было? Если вы хотите использовать его в качестве действительного имени файла, почему вы удваиваете обратную косую черту?

5 голосов
/ 03 февраля 2012

Вы должны использовать:

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

или (без рисунка):

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

Каждому «\» должен предшествовать другой «\». Но это также верно и для предыдущего "\", поэтому вам нужно писать четыре обратных слеша каждый раз, когда вы хотите один в регулярном выражении.

0 голосов
/ 03 февраля 2012

Два объяснения:

1. Заменить двойную обратную косую черту на одну (не то, что вы просили)

Вы должны избежать обратной косой черты. Как это:

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

Первый параметр необходимо экранировать дважды. Один раз для компилятора Java и один раз, потому что вы используете регулярные выражения. Итак, вы хотите заменить две обратные косые черты на одну. Итак, поскольку мы должны избежать обратной косой черты, добавьте одну обратную косую черту. Теперь у вас есть \\. Это будет скомпилировано в \. НО !! Вы должны снова избежать обратной косой черты, потому что первый параметр метода replaceAll использует регулярные выражения. Поэтому, чтобы избежать этого, добавьте обратную косую черту, но эту обратную косую черту нужно экранировать, поэтому мы получаем \\\\. Они для обратной косой черты представляют одну обратную косую черту в регулярном выражении. Но вы хотите заменить двойной обратный слеш на один. Поэтому используйте 8 обратных слешей.

Второй параметр метода replaceAll не использует регулярные выражения, но его также необходимо экранировать. Итак, вам нужно экранировать его один раз для компилятора Java и один раз для метода замены: \\\\. Это компилируется в две обратные косые черты, которые интерпретируются как 1 обратная косая черта в методе replaceAll.

2. Замените один обратный слеш на пару обратных (то, что вы просили)

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

Та же логика, что и выше.

3. Используйте replace() вместо replaceAll().

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

Разница в том, что метод replace() не использует регулярные выражения, поэтому вам не нужно дважды указывать обратную косую черту для первого параметра.

Надеюсь, я хорошо объяснил ...

- Редактировать: исправлена ​​ошибка, указанная xehpuk -

0 голосов
/ 03 февраля 2012

В строках \ по умолчанию используется как escape-символ, поэтому, чтобы выбрать «\» в строке, вы должны использовать «\», а для «\» (т. Е. Дважды), «\\».Это решит вашу проблему, а также будет применено к другим символам, таким как "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...