You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中为含连字符的类JSON字符串添加双引号的问题

解决类JSON字符串添加双引号(支持带连字符的值)

首先,你的问题根源在于\w正则元字符的匹配范围:它只包含字母、数字和下划线,不包括连字符-,所以当字符串值里有-时,\w+会在-前面就停止匹配,把foo-string拆成foo和string两个部分,各自加引号后就出现了"foo"-"string"的错误结果。

方案1:精准匹配键值对(推荐)

既然你的类JSON结构是明确的键:值格式,直接匹配完整的键值对,再分别给键和值加引号会更健壮,也能完美支持带连字符的值:

val jsonString = oldString.replaceAll("(\\w+):([\\w-]+)", "\"$1\":\"$2\"")

解释:

  • (\w+):匹配键名(由字母/数字/下划线组成),捕获为分组1;
  • ::匹配键和值之间的冒号;
  • ([\w-]+):匹配值(由字母/数字/下划线/连字符组成),捕获为分组2;
  • 替换为"$1":"$2":给键和值分别包裹双引号。

方案2:分两次替换(兼容空格场景)

如果你的类JSON里键和值的前后可能有空格(比如foo : bar-string),可以分两次分别处理键和值,同时兼容空格:

// 先给键加引号:匹配冒号前的标识符(允许键和冒号之间有空格)
val step1 = oldString.replaceAll("(\\w+)(?=\\s*:)", "\"$1\"")
// 再给值加引号:匹配冒号后的标识符(允许冒号和值之间有空格,支持连字符)
val jsonString = step1.replaceAll("(?<=:\\s*)([\\w-]+)", "\"$1\"")

解释:

  • (?=\\s*:):正向预查,确保匹配的内容后面跟着0个或多个空格+冒号,只匹配键;
  • (?<=:\\s*):反向预查,确保匹配的内容前面跟着冒号+0个或多个空格,只匹配值;
  • [\w-]+:扩展匹配范围,包含连字符,能完整捕获带连字符的值。

测试示例

输入类JSON:

{ foo:foo-string, bar:barstring }

处理后输出标准JSON:

{ "foo":"foo-string", "bar":"barstring" }

内容的提问来源于stack exchange,提问作者franpen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:32:37