如何在 Scala 中反转义字符串?

How to de-escape string in scala?

我发现了很多关于转义字符串的帖子,但没有关于反转义的帖子。

使用 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 解决方案也是可能的。

您应该使用 scala 标准库中的 unescape 方法。 这是文档的 link,您会在 "Value Members" 部分末尾找到该方法。

这不是一般不转义字符串的答案,而是专门用于处理 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(尽管这是一个相当大的依赖项)。

interpolations which allow you to transform Strings into formatted and/or escaped sequences. These interpolations like s"..." or f"..." are handled in StringContext.

它还提供反向功能:

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