如何在Java中转义字符串?

时间:2010-03-09 01:48:12

标签: java string escaping

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

5 个答案:

答案 0 :(得分:28)

您应该使用StringEscapeUtils中的Apache Commons Text类(您也可以在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

该库中还有许多其他转义实用程序。您可以找到Apache Commons Text in 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"

答案 1 :(得分:5)

使用:

\\n\\t

一些以反斜杠(\)开头的字符形成 转义序列 ,对编译器有特殊意义。因此,在您的情况下,\n\t被视为特殊(分别为换行符和制表符)。因此,我们需要使用反斜杠来对nt进行字面处理。

答案 2 :(得分:5)

StringEscapeUtils适用于与字符串相关的操作

答案 3 :(得分:4)

给定String s

s = s.replace("\\", "\\\\");

\替换所有\\

答案 4 :(得分:4)

此处的许多解决方案建议添加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的list。 (请注意\\首先被转义了,因为您不想稍后再次转义。)

此解决方案的速度虽然不尽如人意,但应该可以解决。理想情况下,您只需解析一次String,并且不需要继续重建String数组。对于较小的String,应该没问题。

如果您从存储数据的角度考虑这个问题,还可以考虑将其转换为Base64表示形式-它是快速,单一的解析方式,并且不会占用过多的空间。