C#正则表达式仅匹配单个值,如何获取多个目标数值?
问题排查与解决方法
咱们一步一步拆解你遇到的问题:
核心问题分析
1. 正则表达式的小数点未转义
你的正则@"([0-9].[0-9]{4}mm)"里的.是正则的特殊字符,代表任意单个字符,而非你要匹配的小数点。这会导致匹配逻辑存在隐患(比如类似0X0000mm的字符串也会被误匹配),必须转义成\.才能精准匹配小数点。
2. 捕获组数量不匹配
你的正则仅定义了1个捕获组(括号包裹的内容),但代码里却尝试获取match.Groups[2].Value,这只会得到空字符串,完全没有意义。
3. 循环中覆盖了结果
你在循环里每次直接给label1.Text赋值,会导致之前匹配到的内容被后续结果覆盖,所以最终只会显示最后一个匹配项(也就是0.0047mm)。
修正后的代码示例
string st = "New Specification Result : Measures 0.0039mm ( 4 Microns )New Specification Result : Measures 0.0047mm ( 5 Microns )"; var src = st; // 修正正则:转义小数点,用\d代替[0-9]更简洁,确保只匹配目标格式 var pattern = @"(\d\.\d{4}mm)"; var expr = new Regex(pattern, RegexOptions.IgnoreCase); // 用StringBuilder累加结果,避免覆盖 StringBuilder resultBuilder = new StringBuilder(); foreach (Match match in expr.Matches(src)) { string key = match.Groups[1].Value; // 可按需添加分隔符,比如逗号加空格 resultBuilder.Append(key + " "); } // 去除末尾多余空格后赋值给标签 label1.Text = resultBuilder.ToString().Trim();
额外优化建议
- 如果数值的整数部分可能不止一位(比如
1.0000mm),可以把正则调整为(\d+\.\d{4}mm),+表示匹配1个或多个整数位数字。 - 若要确保只匹配
Measures后面的数值,可把正则改成Measures (\d\.\d{4}mm),避免字符串中其他位置的类似数值被误匹配。
内容的提问来源于stack exchange,提问作者Yi Jian
相关产品推荐
相关产品推荐

