Guava是否提供了一种解除字符串的方法?

时间:2015-12-04 15:05:46

标签: java guava

我需要转义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('<', "&lt;")
        .addEscape('>', "&gt;")
        .build();

在这里,您可以安全地转义任何文本,将其合并到HTML页面中并随时 unescape 显示它,因为您涵盖了所有可能的含糊之处。

总之,我不明白为什么unescaping是如此有争议。我认为开发者有责任正确使用这个类,了解他的数据并避免含糊不清。 根据定义,转义意味着您最终需要进行转换。否则,它是混淆或其他一些概念。

3 个答案:

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