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

Java Spring Boot正则表达式适配管道分隔多值捕获需求

解决Java Spring Boot中管道分隔多值的正则匹配问题

修改后的正则表达式

针对管道分隔多值的场景,推荐使用以下正则:

^(\D)([+-]?\d+(?:\.\d+)?(?:\|[+-]?\d+(?:\.\d+)?)*)$

正则各部分说明

  • ^(\D):匹配并捕获字符串开头的首个非数字字符(比如Y、º),对应你需要存入HashMap的键。
  • ([+-]?\d+(?:\.\d+)?(?:\|[+-]?\d+(?:\.\d+)?)*):匹配所有数字相关内容,包括:
    • [+-]?\d+(?:\.\d+)?:单个数字(可选正负号,支持整数或小数)
    • (?:\|[+-]?\d+(?:\.\d+)?)*:0个或多个「管道+数字」的组合,非捕获组仅用于分组逻辑,不产生额外捕获项。

Spring Boot中的实现代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MultiValueRegexHandler {
    public static void main(String[] args) {
        // 测试用例
        String[] inputs = {"Y114.9|136.3", "º0|0|0|0", "Z-78.9|+123|45"};
        Pattern pattern = Pattern.compile("^(\\D)([+-]?\\d+(?:\\.\\d+)?(?:\\|[+-]?\\d+(?:\\.\\d+)?)*)$");
        
        HashMap<String, List<String>> dataMap = new HashMap<>();
        
        for (String input : inputs) {
            Matcher matcher = pattern.matcher(input);
            if (matcher.matches()) {
                // 获取前缀字符(存入HashMap的键)
                String prefix = matcher.group(1);
                // 获取所有数字部分的字符串,按管道分割为数组
                String[] valueArray = matcher.group(2).split("\\|");
                List<String> valueList = new ArrayList<>(List.of(valueArray));
                
                // 存入HashMap
                dataMap.put(prefix, valueList);
                
                // 按你期望的格式输出示例
                StringBuilder sb = new StringBuilder(prefix).append(" - ").append(valueList.get(0));
                for (int i = 1; i < valueList.size(); i++) {
                    sb.append(" | ").append(valueList.get(i));
                }
                System.out.println(sb.toString());
            }
        }
        
        // 打印最终存储的HashMap内容
        System.out.println("\n最终HashMap存储结果:");
        dataMap.forEach((key, values) -> System.out.println(key + ": " + values));
    }
}

关键注意事项

  • 使用matches()而非find():确保正则匹配整个输入字符串,避免部分匹配导致的错误。
  • 管道分割时转义:split("\\|")中需要对管道符号转义,因为它在正则里是特殊字符。
  • 兼容正负号与小数:正则支持带+、-的数字,以及整数和小数格式,覆盖你提到的多数场景。

内容的提问来源于stack exchange,提问作者Mark Philips

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:05:31