Guava等效于Apache commons.lang3 StringEscapeUtils.escapeJava()

时间:2018-02-15 01:30:23

标签: java escaping guava apache-commons

目前我正在使用来自Apache Commons的StringEscapeUtils.escapeJava(),但是从3.6开始就被标记为已弃用,建议转移到commons-text包。由于我目前不依赖于此,并且不觉得需要为这一个包添加另一个依赖项,所以我正在研究我的其他一个库(Guava)提供的转义功能。

但是,我找不到与escapeJava()方法等效的方法。由于Guava似乎有点不同,我想知道是否有人可以指出我如何使用Guava获得相同的结果? (或使用commons-lang3中的非弃用类)

2 个答案:

答案 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"));
}