Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache commons.lang3 StringEscapeUtils.escapeJava()的番石榴等效物_Java_Escaping_Guava_Apache Commons - Fatal编程技术网

Apache commons.lang3 StringEscapeUtils.escapeJava()的番石榴等效物

Apache commons.lang3 StringEscapeUtils.escapeJava()的番石榴等效物,java,escaping,guava,apache-commons,Java,Escaping,Guava,Apache Commons,目前我正在使用Apache Commons中的StringEscapeUtils.escapeJava(),但从3.6版开始,它就被标记为不推荐使用,建议转到Commons文本包。因为我目前并不依赖于此,也不觉得有必要为这一个包添加另一个依赖项,所以我正在研究我的另一个包含库(Guava)提供的转义功能 但是,我找不到与escapeJava()方法等效的方法。由于番石榴的作用似乎有点不同,我想知道是否有人能指出我如何使用番石榴达到同样的效果?(或者使用commons-lang3中未弃用的类)我看

目前我正在使用Apache Commons中的
StringEscapeUtils.escapeJava()
,但从3.6版开始,它就被标记为不推荐使用,建议转到
Commons文本
包。因为我目前并不依赖于此,也不觉得有必要为这一个包添加另一个依赖项,所以我正在研究我的另一个包含库(Guava)提供的转义功能


但是,我找不到与
escapeJava()
方法等效的方法。由于番石榴的作用似乎有点不同,我想知道是否有人能指出我如何使用番石榴达到同样的效果?(或者使用commons-lang3中未弃用的类)

我看不到任何可比性。看起来最好的选择就是添加对
commons text
的依赖关系


但是,如果您真的反对,您可以使用Guava的
转义器
,并尝试重新构建
StringEscapeUtils#ESCAPE_Java
中的Java规则。然而,这似乎是一种更糟糕的方法。

因为我在番石榴中找不到任何合适的替代品,所以我使用
lang3
中的
StringUtils
类再次尝试了番石榴。我制作了一个小的实用函数,可以转义换行符和制表符。欢迎提出建议,但现在就可以了

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

如问题中所述,我不想只为这一个方法包含另一个依赖项。@MichielHaisma很公平。我想做你在回答中所做的事情,但归根结底,Apache库是由很多人构建和测试的。在这种情况下,滚动您自己的解决方案可能有效。我';我刚刚发现我';我被自定义解决方案烧掉的次数比被其他依赖项烧掉的次数还要多。也就是说,也许你有一个罐子大小的要求,我';我不知道,它';因为这个原因,你没有';I don’我不想只使用
commons text
。有人找到了一个新的JavaSE或番石榴替代
StringEscapeUtils.escapeJava()
?也许Java10或更高版本的Guava包含这样一种方法…@XDR到目前为止,我还没有发现任何其他方法。请参阅我的最终解决方案的已接受答案。谢谢。除了commons测试中的
escapeJava
之外,我没有使用任何apachecommons库,所以我将继续使用它,直到javase或Guava包含一个替换库。我听说JavaSE将添加一些字符串转义方法作为支持原始字符串的先驱,但我不确定这些方法是否已经在Java中出现。也许它们会出现在Java11中……我建议您用“descape”代码更新这个有用的答案。。。应该只是一个反向替换动作……我将把这样一件小事作为练习留给读者。很高兴你发现我的答案很有用。