Java中匹配嵌套JSON条件数组的正则表达式方案求助
解决Java中嵌套JSON条件字符串的匹配问题
针对嵌套[]条件组的匹配需求,普通正则的贪婪/懒匹配无法处理层级嵌套场景,这里提供两种可行方案,以及更稳妥的JSON解析思路:
方案1:Java 9+ 递归正则匹配
Java 9及以上版本支持递归子表达式,可直接匹配平衡嵌套的[]结构:
正则表达式
\[(?:[^\[\]]|(?R))*\]
\[:匹配开头的左方括号(?:[^\[\]]|(?R))*:非捕获组,匹配任意非括号字符,或递归匹配整个正则(处理嵌套的[])\]:匹配结尾的右方括号
代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class NestedJsonMatcher { public static void main(String[] args) { String input = "[{\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}, \"&&\",\n [{\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}, \"||\", \n {\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}], \"||\", \n {\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}]"; Pattern pattern = Pattern.compile("\\[(?:[^\\[\\]]|(?R))*\\]"); Matcher matcher = pattern.matcher(input); if (matcher.find()) { System.out.println("完整匹配内容:"); System.out.println(matcher.group()); } } }
方案2:手动解析(兼容所有Java版本)
如果项目使用Java 8及以下,递归正则不支持,可通过计数括号深度手动提取完整嵌套结构:
代码示例
public class NestedArrayExtractor { public static String getFullNestedArray(String input) { int startIdx = input.indexOf('['); if (startIdx == -1) return null; int depth = 1; int endIdx = startIdx + 1; while (endIdx < input.length() && depth > 0) { char c = input.charAt(endIdx); if (c == '[') depth++; else if (c == ']') depth--; endIdx++; } return depth == 0 ? input.substring(startIdx, endIdx) : null; } public static void main(String[] args) { String input = "[{\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}, \"&&\",\n [{\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}, \"||\", \n {\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}], \"||\", \n {\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}]"; String result = getFullNestedArray(input); if (result != null) { System.out.println("完整匹配内容:"); System.out.println(result); } else { System.out.println("未找到完整嵌套数组或括号不匹配"); } } }
更稳妥的方案:直接用JSON解析库
如果最终需要解析条件内容而非仅匹配字符串,强烈建议使用Jackson、Gson等JSON库,避免正则在处理特殊场景(如字符串中包含[/])时出错:
Jackson示例
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class JsonConditionParser { public static void main(String[] args) { String input = "[{\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}, \"&&\",\n [{\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}, \"||\", \n {\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}], \"||\", \n {\"field\":\"type\",\"operand\":\"=\",\"value\":\"column\"}]"; ObjectMapper mapper = new ObjectMapper(); try { JsonNode root = mapper.readTree(input); System.out.println("解析后的结构化内容:"); System.out.println(root.toPrettyString()); // 可进一步遍历节点处理条件逻辑 } catch (IOException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者J055Y
相关产品推荐
相关产品推荐

