You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:05:37