目录
- 背景
- 代码
- 正则说明
背景
很多时候,在无法使用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)
作用:确保当前匹配位置的后面是 }" 或 ]",后面跟着 , 或 }?=:先行断言
[]}]:匹配 ] 或 }
\":一个双引号
[,}]:一个逗号或右大括号
]:结束断言
✅ 合起来:匹配一个位置,它的后面是 }" 或 ]",然后是 , 或 }