如何在 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
我发现了很多关于转义字符串的帖子,但没有关于反转义的帖子。
使用 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