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
相关产品推荐
相关产品推荐

