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

求匹配特定嵌套结构的正则表达式用于Jackson CSV反序列化

解决方案:用正则表达式简化解析逻辑

步骤1:定义匹配规则

针对你给出的字符串结构,可通过两步处理实现解析:

  1. 匹配每个内部的POJO值组(如{'Mr. Bubbles','dog'})
  2. 提取每组中的具体值,自动忽略值前后可能存在的空格

对应的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:20:14