如何在Scala中取消转义字符串?

8

我发现很多关于转义字符串的文章,但没有关于反转义的。

使用Scala Play,我的控制器接受一个JSON请求。我通过以下方式从中提取字符串:

val text: play.api.libs.json.JsValue = request.body.\("source")

如果我打印 text.toString,我会得到例如:
"Hello\tworld\nmy name is \"ABC\""

我该如何将这个转义后的文本变成正常的文本?结果应该看起来像这样:
Hello    world
my name is "ABC"

到目前为止,我尝试了以下方法:

replaceAll("""\\t""", "\t")

然而,创建所有可能的转义规则可能太复杂了。因此我的问题是:如何轻松地做到这一点?可能使用标准库。也可以使用Java解决方案。

3个回答

29

有一些插值可以将字符串转换成格式化和/或转义序列。这些插值,如s"..."f"...",在StringContext中进行处理。

它还提供了一个反转函数:

val es = """Hello\tworld\nmy name is \"ABC\""""
val un = StringContext treatEscapes es

请解释为什么要踩(downvote)。这个方法提供了所请求的结果。 - Flown
我没有给你投反对票,相反,我将你的帖子标记为答案并点了赞。它完全按照描述的方式工作。谢谢你。 - petrbel
2
我实际上是指那些没有留下任何评论的点踩者。很高兴我能帮到你。 - Flown
我不是那个给你点踩的人,但可能的原因是Scala字符串转义序列与JSON的不同。 - Alexey Romanov

3
这不是一个通用的字符串反转义的答案,而是专门处理 JsValue 的方法:
text match { 
  case JsString(value) => value
  case _ => // what do you want to do for other cases?
}

你可以这样实现unescape:
def unescapeJson(s: String) = JSON.parse('"' + s + '"') match {
  case JsString(value) => value
  case _ => ??? // can't happen
}

或者使用 Apache Commons Lang 中的 StringEscapeUtils(尽管这是一个相当大的依赖项)。

这可能只是注释而已,无论如何,很好的观点,谢谢 :) - petrbel
1
其他答案只涉及Scala转义序列,这与JSON转义序列不同(\/在JSON中有效但在Scala中无效,八进制转义相反)。 - Alexey Romanov
@petrbel 我实际上添加了几个选项 :) - Alexey Romanov

0

你应该使用 Scala 标准库中的 unescape 方法。这里是链接到文档,你会在“Value Members”部分的最后找到该方法。


这个来自于 scala.xml,用于反转义 HTML 实体 而不是反斜杠反转义。 - Lukasz Czerwinski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接