如何在Java中转义字符串?

2022-09-01 00:25:08

我正在阅读Java中的源文件,但是当我打印它(sysout)时,转义字符不再转义。如何在Java中转义字符串中的字符?\n\t


答案 1

你应该使用Apache Commons Text中的StringEscapeUtils类(你也可以在Apache Commons Lang3中找到这个类,但那个类已被弃用)。你会发现Apache Commons中还有很多其他产品,可能对Java开发中的其他问题有用,这样你就不会重新发明轮子。

您想要的特定调用与“Java转义”有关;API 调用是 StringEscapeUtils.escapeJava()。。例如:

System.out.println(StringEscapeUtils.escapeJava("Hello\r\n\tW\"o\"rld\n"));

将打印出来:

Hello\r\n\tW\"o\"rld\n

该库中还有很多其他逃避的实用程序。你可以在 Maven Central 中找到 Apache Commons Text,然后将其添加到 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"

答案 2

这里的许多解决方案都建议添加Apache Commons Text并使用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表示形式 - 它快速,单次解析并且不会使用太多额外空间。