目錄
- 背景
- 代碼
- 正則說明
背景
很多時候,在無法使用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)
作用:確保當前匹配位置的后面是 }" 或 ]",后面跟著 , 或 }?=:先行斷言
[]}]:匹配 ] 或 }
\":一個雙引號
[,}]:一個逗號或右大括號
]:結束斷言
? 合起來:匹配一個位置,它的后面是 }" 或 ]",然后是 , 或 }