我需要逃避一个特殊字符String
.
Guava提供了这个Escaper
类,它正是这样做的:
Escaper escaper = Escapers.builder() .addEscape('[', "\\[") .addEscape(']', "\\]") .build(); String escapedStr = escaper.escape("This is a [test]"); System.out.println(escapedStr); // -> prints "This is a \[test\]"
现在我有一个逃脱String
,我需要解除它,我在番石榴找不到任何东西来做这件事.
我期待Escaper
有一种unescape()
方法,但事实并非如此.
编辑:我知道在一些非意义的情况下,取消内容可能很棘手,甚至是不可能的.
例如,这种Escaper
用法可能导致含糊不清:
Escaper escaper = Escapers.builder() .addEscape('@', " at ") .addEscape('.', " dot ") .build();
除非转义的数据仅包含电子邮件地址,否则您无法通过取消它来安全地获取数据.
Escaper
HTML实体安全使用的一个很好的例子:
Escaper escaper = Escapers.builder() .addEscape('&', "&") .addEscape('<', "<") .addEscape('>', ">") .build();
在这里,您可以安全地转义任何文本,将其合并到HTML页面中并随时取消它以显示它,因为您涵盖了所有可能的含糊之处.
总之,我不明白为什么unescaping是如此有争议.我认为开发者有责任正确使用这个类,了解他的数据并避免含糊不清.根据定义,转义意味着您最终需要进行转换.否则,它是混淆或其他一些概念.
不,不是的.显然,这是故意的.引用Chris Povirk回答的讨论:
unescaping的用例对我来说不太清楚.如果没有理解语言的解析器,通常无法识别转义的源文本.例如,如果我有以下输入:
String s = "foo\n\"bar\"\n\\";然后,我的解析器已经理解
\n
,\"
以及\\
为了确定...foo\n\"bar\"\n\\......是"未转义"的文字.换句话说,它必须已经做了unescaping.情况类似于HTML和其他格式:我们不需要一个unescaper,因为我们需要一个解析器.
所以看起来你必须自己做.