正则捕获组重置:如何统一解析嵌套与非嵌套值至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}}
逻辑说明
- 保留原有正则匹配逻辑,优先识别嵌套的
KEY(VALUE)格式内容,解析为内层Map的键值对 - 新增判断:当内层Map为空时,说明当前外层括号内的内容不是嵌套结构,直接将该内容作为内层Map的key,值设为空字符串(匹配期望输出格式)
- 无需修改原有正则表达式,通过后续逻辑补充即可实现需求,避免了复杂的分支匹配或分支重置组的使用
内容的提问来源于stack exchange,提问作者Viktor Mellgren
相关产品推荐
相关产品推荐

