求匹配特定嵌套结构的正则表达式用于Jackson CSV反序列化
解决方案:用正则表达式简化解析逻辑
步骤1:定义匹配规则
针对你给出的字符串结构,可通过两步处理实现解析:
- 匹配每个内部的POJO值组(如
{'Mr. Bubbles','dog'}) - 提取每组中的具体值,自动忽略值前后可能存在的空格
对应的Java正则表达式可定义为:
private static final Pattern PET_PATTERN = Pattern.compile("\\{'\\s*(.*?)\\s*','\\s*(.*?)\\s*'\\}");
该正则会精准匹配以{'开头、'}结尾的片段,同时捕获两个字段值,自动过滤值前后的空格。
步骤2:实现解析逻辑
替换原deserialize方法中的混乱代码,用正则批量匹配并转换为Pet对象:
private static List<Pet> deserialize(String serializedPets) { List<Pet> pets = new ArrayList<>(); // 移除可能存在的首尾双引号(适配CSV解析后的字符串格式) String cleaned = serializedPets.replaceAll("^\"|\"$", ""); Matcher matcher = PET_PATTERN.matcher(cleaned); while (matcher.find()) { // 按POJO定义的顺序获取字段值 String petName = matcher.group(1); String petType = matcher.group(2); pets.add(new Pet(petName, petType)); } // 处理空数组场景:原字符串为"[]"或[]时返回空列表 if (cleaned.equals("[]") && pets.isEmpty()) { return List.of(); } return pets; }
适配多字段/基本类型的扩展
- 如果POJO包含更多字段,只需扩展正则的捕获组数量即可,例如三个字段的POJO,正则可改为:
Pattern.compile("\\{'\\s*(.*?)\\s*','\\s*(.*?)\\s*','\\s*(.*?)\\s*'\\}"); - 若字段为int/long等基本类型,捕获后直接做类型转换即可:
int age = Integer.parseInt(matcher.group(3));
适配所有场景说明
- 自动兼容元素间的空格差异(如
{'a','b'}和{'a', 'b'}均可正常匹配) - 完全遵循值的顺序,与POJO定义的字段顺序严格对应
- 空数组输入(
"[]")会返回空列表,符合需求
内容的提问来源于stack exchange,提问作者Jan Nielsen
相关产品推荐
相关产品推荐

