【问题标题】:How to de-escape string in scala?如何在scala中取消转义字符串?
【发布时间】:2023-03-19 13:09:01
【问题描述】:

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

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

【问题讨论】:

    标签: java json scala escaping


    【解决方案1】:

    interpolations 允许您将字符串转换为格式化和/或转义序列。 s"..."f"..." 这样的插值在 StringContext 中处理。

    它还提供反向功能:

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

    【讨论】:

    • 请解释否决票。此方法提供请求的结果。
    • 我没有对您投反对票,相反,我将您的帖子标记为答案并投了赞成票。它完全按照描述工作。谢谢
    • 我实际上是在没有留下任何 cmets 的情况下表示反对者。很高兴能帮到你。
    • 我不是反对者,但可能的原因是 Scala 字符串转义序列与 JSON 不同。
    【解决方案2】:

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

    【讨论】:

    • 这应该只是评论,无论如何,好点,谢谢:)
    • 其他答案只处理 Scala 转义序列,这与 JSON 转义序列不同(\/ 在 JSON 中有效,但在 Scala 中无效,八进制转义反之亦然)。
    • @petrbel 我实际上添加了更多选项:)
    【解决方案3】:

    您应该使用 scala 标准库中的 unescape 方法。 这是文档中的link,您可以在“值成员”部分的末尾找到该方法。

    【讨论】:

    • 这个来自scala.xml,用于取消转义HTML实体而不是反斜杠取消转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2011-02-09
    • 2011-04-02
    相关资源
    最近更新 更多