Как мне избежать строки в Java?
Я читаю исходный файл на Java, но когда я его печатаю (sysout), экранированные символы больше не экранируются. Как я могу избежать таких персонажей, как \n
а также \t
в строке в Java?
4 ответа
Вы должны использовать StringEscapeUtils
класс из Apache Commons Text (вы также можете найти класс в Apache Commons Lang3, но этот класс устарел). Вы обнаружите, что в Apache Commons есть множество других предложений, которые могут пригодиться для решения других проблем, возникающих у вас при разработке Java, так что вы не изобретаете колесо.
Конкретный вызов, который вы хотите, связан с "Java escapeing"; вызов API StringEscapeUtils.escapeJava()
, Например:
System.out.println(StringEscapeUtils.escapeJava("Hello\r\n\tW\"o\"rld\n")
распечатал бы:
Hello\r\n\tW\"o\"rld\n
В этой библиотеке также есть множество других экранирующих утилит. Вы можете найти Apache Commons Text в Maven Central и добавить его в свой проект Maven следующим образом:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.3</version>
</dependency>
и если вы используете Gradle:
compile "org.apache.commons:commons-text:1.3"
Многие решения здесь предлагают добавить текст Apache Commons и использовать StringEscapeUtils. Некоторые другие решения здесь просто неверны.
Возможные решения следующие:
/**
* escape()
*
* Escape a give String to make it safe to be printed or stored.
*
* @param s The input String.
* @return The output String.
**/
public static String escape(String s){
return s.replace("\\", "\\\\")
.replace("\t", "\\t")
.replace("\b", "\\b")
.replace("\n", "\\n")
.replace("\r", "\\r")
.replace("\f", "\\f")
.replace("\'", "\\'")
.replace("\"", "\\\"");
}
Список экранирования взят из списка Oracle. (Обратите внимание, что\\
экранируется первым, так как вы не хотите, чтобы это произошло позже.)
Это решение не так быстро, как могло бы быть, но оно должно работать. В идеале вы должны анализировать String только один раз, и вам не нужно будет заново создавать массив String. Для маленьких струн это должно быть нормально.
Если вы думаете об этом с точки зрения хранения данных, подумайте также о том, как преобразовать их в представление Base64 - это быстрый, однократный синтаксический анализ и не требует слишком много дополнительного места.
С помощью:
\\n
а также \\t
Некоторым символам предшествует обратная косая черта (\
) формируют escape-последовательность и имеют особое значение для компилятора. Так что в вашем случае \n
а также \t
обрабатываются как специальные (перевод строки и табуляция соответственно). Таким образом, нам нужно избежать обратной косой черты, чтобы сделать n
а также t
трактуется буквально.
Дано String s
,
s = s.replace("\\", "\\\\");
Заменяет все \
с \\
,