我正在阅读Java中的源文件,但是当我打印它(sysout)时,转义的字符不再被转义。如何在Java中的字符串中转义\n
和\t
等字符?
答案 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
被视为特殊(分别为换行符和制表符)。因此,我们需要使用反斜杠来对n
和t
进行字面处理。
答案 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表示形式-它是快速,单一的解析方式,并且不会占用过多的空间。