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

Eri*_*ire 7 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\]"
Run Code Online (Sandbox Code Playgroud)

现在我有一个逃脱String,我需要解除它,我在番石榴找不到任何东西来做这件事.

我期待Escaper有一种unescape()方法,但事实并非如此.

编辑:我知道在一些非意义的情况下,取消内容可能很棘手,甚至是不可能的.

例如,这种Escaper用法可能导致含糊不清:

Escaper escaper = Escapers.builder()
        .addEscape('@', " at ")
        .addEscape('.', " dot ")
        .build();
Run Code Online (Sandbox Code Playgroud)

除非转义的数据仅包含电子邮件地址,否则您无法通过取消它来安全地获取数据.

EscaperHTML实体安全使用的一个很好的例子:

Escaper escaper = Escapers.builder()
        .addEscape('&', "&")
        .addEscape('<', "&lt;")
        .addEscape('>', "&gt;")
        .build();
Run Code Online (Sandbox Code Playgroud)

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

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

Tun*_*aki 5

不,不是的.显然,这是故意的.引用Chris Povirk回答的讨论:

unescaping的用例对我来说不太清楚.如果没有理解语言的解析器,通常无法识别转义的源文本.例如,如果我有以下输入:

String s = "foo\n\"bar\"\n\\";
Run Code Online (Sandbox Code Playgroud)

然后,我的解析器已经理解\n,\"以及\\为了确定...

foo\n\"bar\"\n\\
Run Code Online (Sandbox Code Playgroud)

......是"未转义"的文字.换句话说,它必须已经做了unescaping.情况类似于HTML和其他格式:我们不需要一个unescaper,因为我们需要一个解析器.

所以看起来你必须自己做.

  • @ChrisPovirk恕我直言,"Escaper"应该是对称的.如果*unescape*对应的实现,我认为它应该是`Escaper`类的一个方法,它包含了所有有用的信息.当然,如果没有人需要,它可能不值得.正如你所提到的,大多数情况下,unescaping是由*其他*完成的,例如浏览器.如果您决定在番石榴中介绍此内容,请告诉我,我很乐意为您提供帮助. (4认同)
  • 我不明白。就我而言,要*未转义*的文本是众所周知的:它在`escapedStr`中。我不需要解析Java代码,我只需要在一个简单的String中删除转义序列。 (2认同)
  • @ChrisPovirk你可能想对这个问题发表评论,以便OP得到通知. (2认同)
  • @ChrisPovirk 我需要通过用分隔符(`-`、`_` 等)连接来序列化一个值列表。如果一个值包含给定的分隔符,我需要用 *safe* 字符替换它,这样我就可以在反序列化时拆分它们,并用原始文字替换 *safe* 字符。我目前正在使用一个简单的`Map` 并对其进行迭代,用值(*safe* 字符)替换键(分隔符)。在反序列化时,我只是恢复了`Map`,然后再做一次。我找到了 `Escaper` 类,我认为它可以满足我的需求,并为我保存了这个样板代码。 (2认同)