将字母数字字符串转数字-字符串Map时生成空Map的问题排查
解决RestAPI响应体字符串转<Integer, String> Map为空的问题
兄弟,你的代码运行后得到空Map,核心问题出在正则表达式的写法错误,以及对Matcher分组的误用上,咱们一步步来修正:
问题根源分析
先看你的原字符串:1XXGTE_FUSION2XXBIR_STALIO3XXVTE_CORE,它的结构是「数字+XX+大写字母/下划线组合」重复出现。但你写的正则[^a-zA-Z0-9']+是用来匹配非字母数字、非单引号的字符,既没有定义捕获分组,也完全没匹配到你想要的「数字-字符串」对,所以matcher.find()根本找不到符合的内容,循环自然不会执行,Map也就为空了。
修正后的完整代码
String alphaNumericStr = "1XXGTE_FUSION2XXBIR_STALIO3XXVTE_CORE"; // 正则捕获:分组1是数字,分组2是XX后面的字母下划线组合 String regex = "(\\d+)XX([A-Z_]+)"; Matcher matcher = Pattern.compile(regex).matcher(alphaNumericStr); Map<Integer, String> map = new HashMap<>(); while (matcher.find()) { // 分组1是数字字符串,转成Integer作为键;分组2是对应的值 map.put(Integer.parseInt(matcher.group(1)), matcher.group(2)); } System.out.println(map);
代码解释
- 正则表达式:
(\\d+)XX([A-Z_]+)(\\d+):捕获一个或多个连续数字,作为Map的键XX:匹配字符串里的固定分隔符([A-Z_]+):捕获XX后面的大写字母和下划线组合,作为Map的值
- 如果你的字符串里可能出现小写字母,可以把正则改成
(\\d+)XX([a-zA-Z_]+),或者在编译正则时添加不区分大小写的模式:Pattern.compile(regex, Pattern.CASE_INSENSITIVE)
运行结果
执行这段代码后,你会得到预期的Map:
{1=GTE_FUSION, 2=BIR_STALIO, 3=VTE_CORE}
内容的提问来源于stack exchange,提问作者Aravinda Meewalaarachchi
相关产品推荐
相关产品推荐

