我需要转义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页面中并随时 unescape 显示它,因为您涵盖了所有可能的含糊之处。
总之,我不明白为什么unescaping是如此有争议。我认为开发者有责任正确使用这个类,了解他的数据并避免含糊不清。 根据定义,转义意味着您最终需要进行转换。否则,它是混淆或其他一些概念。
答案 0 :(得分:5)
不,它没有。显然,这是故意的。引自Chris Povirk回答的this discussion:
unescaping的用例对我来说不太清楚。通常不是 甚至可以在没有解析器的情况下识别转义的源文本 了解语言。例如,如果我有以下内容 输入:
String s = "foo\n\"bar\"\n\\";
然后我的解析器必须已经理解
\n
,\"
和\\
才能 确定......foo\n\"bar\"\n\\
...是“未转义”的文字。换句话说,它必须这样做 已经没有了。情况类似于HTML和其他 格式:我们不需要一个unescaper,因为我们需要一个解析器。
所以看起来你必须自己做。
答案 1 :(得分:3)
如果您只需要浏览HTML实体,Unicode字符和控制字符,例如\n
或\t
,您只需使用StringEscapeUtils中的Apache Commons Lang类。
答案 2 :(得分:0)
如果有人需要一个char unescaper,下面是一个简单的实现:
@Nonnull
public String unescape(@Nonnull String text) {
CharacterIterator i = new StringCharacterIterator(text);
StringBuilder result = new StringBuilder(text.length());
for (char c = i.first(); c != DONE; c = i.next()) {
if (c == escaped) {
result.append(i.next());
} else {
result.append(c);
}
}
return result.toString();
}