Dart如何解析含分号和冒号的字符串并提取键值对?
Hey,我来给你分享几个在Dart里解析这种str1:1234;str2:1234;格式字符串的实用方法,根据你的场景选就行~
方法一:基础字符串拆分法
这种方法逻辑直白,完全原生不依赖第三方包,适合格式严格符合要求的场景:
void main() { const String input = "str1:1234;str2:1234;"; // 第一步:按分号分割字符串,过滤掉末尾空字符串(因为原字符串最后有个分号) final List<String> keyValuePairs = input.split(';').where((pair) => pair.isNotEmpty).toList(); final Map<String, String> result = {}; for (final String pair in keyValuePairs) { // 第二步:把每个键值对按冒号拆分成键和值 final List<String> parts = pair.split(':'); // 做个安全校验,避免格式异常导致报错 if (parts.length == 2) { final String key = parts[0].trim(); // 可选:去掉键前后的空格(如果有的话) final String value = parts[1].trim(); // 可选:去掉值前后的空格 result[key] = value; } } print(result); // 输出: {str1: 1234, str2: 1234} }
方法二:正则表达式法
如果你的字符串格式可能有细微变化(比如键值周围偶尔有空格,或者值的类型不只是数字),正则表达式会更灵活:
void main() { const String input = "str1:1234;str2:1234;"; // 正则规则:捕获键(匹配除冒号外的任意非空字符)和值(匹配除分号外的任意非空字符) final RegExp regExp = RegExp(r'([^:]+):([^;]+);'); final Map<String, String> result = {}; // 遍历所有匹配到的键值对 final Iterable<Match> matches = regExp.allMatches(input); for (final Match match in matches) { // group(1)是捕获的键,group(2)是捕获的值,加!是因为我们确定匹配到了内容 final String key = match.group(1)!.trim(); final String value = match.group(2)!.trim(); result[key] = value; } print(result); // 输出: {str1: 1234, str2: 1234} }
额外小提示
- 如果需要把值转换成整数类型,可以在提取后用
int.parse(value),记得加上try-catch处理格式错误的情况,避免程序崩溃。 - 如果键或值里包含特殊字符(比如下划线、横杠),上面的正则已经能覆盖,要是有更复杂的需求,只需要微调正则规则就行。
内容的提问来源于stack exchange,提问作者x98
相关产品推荐
相关产品推荐

