JSON值包含引号 - 详解

背景

很多时候,在无法使用Gson等能处理非标准化JSON的工具时,需要对JSON值中的JSON限定符进行转义,使用正则比较方便,以对JSON值中的引号做转义为例

代码

private static String escapeUnescapedQuotes(String jsonStr) {
String regex = "(?<=\": \"[{\\[])(.*?)(?=[]}]\"[,}])";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(jsonStr);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String matchedValue = matcher.group(1);
// 捕获组 1 是字段值
String escapedValue = matchedValue.replace("\"", "\\\"");
matcher.appendReplacement(sb, Matcher.quoteReplacement(escapedValue));
}
matcher.appendTail(sb);
return sb.toString();
}

正则说明

这里的正则使用了\s匹配空格,因为要解析的json值前面有空格

第一部分:(?<=\": \"[{\\[]) —— 后行断言(Positive Lookbehind)
作用:确保当前匹配位置的前面是 ": [{ 或 ": ["
?<=:表示“后行断言”——“必须满足,但不包含在结果中”
\": :匹配字面量 ": (注意有空格)
\":一个双引号
\\[:一个左方括号 [(\ 是转义符,因为 [ 在正则中有特殊含义)
{:一个左大括号
所以 [{\\[] 表示匹配 { 或 [
✅ 合起来:
匹配一个位置,它的前面是 ":  后跟 { 或 [
第二部分:(.*?) —— 捕获组(Capturing Group)
.:匹配任意字符(除换行外)
*?:非贪婪匹配(尽可能少地匹配)
(.*?):把匹配到的内容捕获到 group(1) 中
这部分就是要提取并转义的 JSON 字符串内容
第三部分:(?=[]}]\"[,}]) —— 先行断言(Positive Lookahead)
作用:确保当前匹配位置的后面是 }" 或 ]",后面跟着 , 或 }
?=:先行断言
[]}]:匹配 ] 或 }
\":一个双引号
[,}]:一个逗号或右大括号
]:结束断言
✅ 合起来:
匹配一个位置,它的后面是 }" 或 ]",然后是 , 或 }
posted @ 2025-08-17 09:16  yfceshi  阅读(26)  评论(0)    收藏  举报