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
相关产品推荐
相关产品推荐

