如何在值含逗号时将String转为Map<String, String>?
用正则Split处理带引号的键值对字符串完全可行
直接给结论:可以用带正向预查的正则表达式作为split的分隔符,精准拆分不在双引号内的逗号,完美解决值里含逗号导致拆分错误的问题,而且不需要依赖任何第三方库,完全适配安卓平台。
核心正则表达式
用这个正则匹配分隔符:
,(?=(?:[^"]*"[^"]*")*[^"]*$)
它的作用是:只匹配那些后面跟着偶数个双引号的逗号——换句话说,就是不在双引号包裹范围内的逗号,完全避开值里的逗号。
安卓Java代码实现示例
import java.util.HashMap; import java.util.Map; public class StringToMapUtil { public static Map<String, Object> convertToMap(String inputStr) { Map<String, Object> resultMap = new HashMap<>(); // 先清理输入首尾的多余空格和可能的外层引号 String cleanedInput = inputStr.trim().replaceAll("^\"|\"$", ""); // 用正则拆分每个键值对条目 String[] keyValueEntries = cleanedInput.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); for (String entry : keyValueEntries) { // 按冒号拆分键和值,只拆一次(防止值里出现冒号) String[] keyValuePair = entry.split(":", 2); if (keyValuePair.length != 2) { continue; // 跳过格式错误的条目 } // 清理键的引号和空格 String key = keyValuePair[0].trim().replaceAll("^\"|\"$", ""); // 清理值的引号和空格 String rawValue = keyValuePair[1].trim().replaceAll("^\"|\"$", ""); // 可选:把数字类型的值转成对应类型(按需调整) Object value; try { value = Integer.parseInt(rawValue); } catch (NumberFormatException e1) { try { value = Double.parseDouble(rawValue); } catch (NumberFormatException e2) { value = rawValue; // 非数字就存字符串 } } resultMap.put(key, value); } return resultMap; } }
注意事项
- 这个方案假设输入的字符串格式是规范的:所有键值对都用双引号包裹,没有嵌套的双引号,也没有转义引号(比如
\")。如果你的场景存在转义引号,需要先处理转义字符再用这个正则。 split(":", 2)里的2很重要,确保只拆分键和值的第一个冒号,避免值里有冒号导致拆分错误。
内容的提问来源于stack exchange,提问作者jh1
相关产品推荐
相关产品推荐

