目前我正在使用来自Apache Commons的StringEscapeUtils.escapeJava()
,但是从3.6开始就被标记为已弃用,建议转移到commons-text
包。由于我目前不依赖于此,并且不觉得需要为这一个包添加另一个依赖项,所以我正在研究我的其他一个库(Guava)提供的转义功能。
但是,我找不到与escapeJava()
方法等效的方法。由于Guava似乎有点不同,我想知道是否有人可以指出我如何使用Guava获得相同的结果? (或使用commons-lang3
中的非弃用类)
答案 0 :(得分:2)
我没有看到任何类似的东西。看起来最好的选择就是在commons-text
上添加依赖项。
但是,如果您真的反对,可以使用Guava的Escapers
并尝试重新构建StringEscapeUtils#ESCAPE_JAVA
中的Java规则。然而,这似乎是一种更糟糕的方法。
答案 1 :(得分:0)
由于我在番石榴中找不到任何合适的替代品,我使用StringUtils
中的lang3
类给了它另一个。我做了一个小的实用程序函数,它可以转义换行符和制表符。建议欢迎,但现在这样做。
public static String escapeForLogs(String input) {
return org.apache.commons.lang3.StringUtils.replaceEach(
input,
new String[] { "\r\n", "\r", "\n", "\t" },
new String[] { "\\\\n", "\\\\n", "\\\\n", "\\\\t" }
);
}
我对它进行了以下测试:
@Test
public void testEscapeForLogs() {
assertEquals("without linebreaks/tabs stays the same", "lala", e scapeForLogs("lala"));
assertEquals("empty string is fine", "", escapeForLogs(""));
assertEquals("newline gets escaped", "\\\\n", escapeForLogs("\n"));
assertEquals("two newlines", "\\\\n\\\\n", escapeForLogs("\n\n"));
assertEquals("tab", "\\\\t", escapeForLogs("\t"));
assertEquals("return carridge gets escaped", "\\\\n", escapeForLogs("\r"));
assertEquals("return carridge+newline gets converted", "\\\\n", escapeForLogs("\r\n"));
assertEquals("newline before cr+nl", "\\\\n\\\\n", escapeForLogs("\n\r\n"));
assertEquals("2 cr+nl", "\\\\n\\\\n", escapeForLogs("\r\n\r\n"));
assertEquals("some combination", "lala\\\\nlalala\\\\n\\\\nla\\\\tla", escapeForLogs("lala\nlalala\n\nla\tla"));
}