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

正则捕获组重置:如何统一解析嵌套与非嵌套值至Map

正则匹配与Map解析解决方案

问题场景

需要实现以下解析逻辑:

  • 优先识别嵌套Map格式内容(如OUTERVALUE(INNERVALUE(123)OTHERVALUE(456))),解析为外层Map键对应内层Map的结构
  • 若无法解析出嵌套结构(如VALUE(123)),则将括号内的整体值作为内层Map的key,对应值设为空字符串
  • 需保持正则捕获组结构,此前尝试分支匹配、分支重置组均未达到预期效果

原Java代码

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Scratch {

  public static void main(String[] args) {

    final Pattern outerKeyPattern = Pattern.compile("([A-Z]+)\\((.*)\\)", Pattern.MULTILINE);
    final Pattern innerPattern = Pattern.compile("([A-Z]+)\\((.*?)\\)");

    String input = """
      VALUE(123)
      OUTERVALUE(INNERVALUE(123)OTHERVALUE(456))
      """;

    Map<String, Map<String, String>> outer = new HashMap<>();
    Matcher matcher = outerKeyPattern.matcher(input);
    while (matcher.find()) {
      String key = matcher.group(1);
      String value = matcher.group(2);
      Matcher valueMatcher = innerPattern.matcher(value);
      Map<String, String> innerMap = new HashMap<>();
      while (valueMatcher.find()) {
        innerMap.put(valueMatcher.group(1), valueMatcher.group(2));
      }
      outer.put(key, innerMap);
    }

    System.out.println(outer);
  }
}

当前输出

{VALUE={}, OUTERVALUE={INNERVALUE=123, OTHERVALUE=456}}

期望输出

{VALUE={123=}, OUTERVALUE={INNERVALUE=123, OTHERVALUE=456}}

解决方案

核心修改点是在解析内层Map后,判断是否匹配到嵌套结构:若未匹配到任何内容,则将外层括号内的整体值作为内层Map的key,对应值设为空字符串。

修改后的代码

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Scratch {

  public static void main(String[] args) {

    final Pattern outerKeyPattern = Pattern.compile("([A-Z]+)\\((.*)\\)", Pattern.MULTILINE);
    final Pattern innerPattern = Pattern.compile("([A-Z]+)\\((.*?)\\)");

    String input = """
      VALUE(123)
      OUTERVALUE(INNERVALUE(123)OTHERVALUE(456))
      """;

    Map<String, Map<String, String>> outer = new HashMap<>();
    Matcher matcher = outerKeyPattern.matcher(input);
    while (matcher.find()) {
      String key = matcher.group(1);
      String value = matcher.group(2);
      Matcher valueMatcher = innerPattern.matcher(value);
      Map<String, String> innerMap = new HashMap<>();
      while (valueMatcher.find()) {
        innerMap.put(valueMatcher.group(1), valueMatcher.group(2));
      }
      // 新增逻辑:内层Map为空时,将整体value作为key
      if (innerMap.isEmpty()) {
        innerMap.put(value, "");
      }
      outer.put(key, innerMap);
    }

    System.out.println(outer);
  }
}

修改后输出

{VALUE={123=}, OUTERVALUE={INNERVALUE=123, OTHERVALUE=456}}

逻辑说明

  1. 保留原有正则匹配逻辑,优先识别嵌套的KEY(VALUE)格式内容,解析为内层Map的键值对
  2. 新增判断:当内层Map为空时,说明当前外层括号内的内容不是嵌套结构,直接将该内容作为内层Map的key,值设为空字符串(匹配期望输出格式)
  3. 无需修改原有正则表达式,通过后续逻辑补充即可实现需求,避免了复杂的分支匹配或分支重置组的使用

内容的提问来源于stack exchange,提问作者Viktor Mellgren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:50:22