C# 正则表达式区分提取区间字符串首、次匹配数值的方法
解决方案
通用正则表达式
你可以用下面这一条正则覆盖所有三类场景的数值提取,通过捕获组可以直接区分符号、左值、右值:
^(?:(?<Operator><|>)\s*)?(?<LeftVal>[\d,.]+)(?:\s*-\s*(?<RightVal>[\d,.]+))?$
匹配规则说明
这条正则对三类场景的捕获结果如下:
- 「小于x」场景(如
< 0,5、< 120000):Operator组捕获到<,LeftVal组捕获到数值x,RightVal组为空 - 「大于x」场景(如
> 12):Operator组捕获到>,LeftVal组捕获到数值x,RightVal组为空 - 「介于x和y之间」场景(如
10 - 22、3.50000 - 11.0):Operator组为空,LeftVal组捕获到左值x,RightVal组捕获到右值y
优化后的代码示例
不需要多次判断字符串包含的字符,一次正则匹配就可以完成所有取值逻辑:
var match = Regex.Match(r.Descr, @"^(?:(?<Operator><|>)\s*)?(?<LeftVal>[\d,.]+)(?:\s*-\s*(?<RightVal>[\d,.]+))?$"); if (match.Success) { // 处理小数分隔符如果是逗号的场景,按需指定CultureInfo var culture = CultureInfo.InvariantCulture; // 如果逗号是小数分隔符,改用下面的culture // var culture = new CultureInfo("fr-FR"); // 适配逗号作为小数分隔符的区域格式 Low = match.Groups["Operator"].Value == ">" ? new Quantity { Value = Convert.ToDecimal(match.Groups["LeftVal"].Value, culture) } : match.Groups["RightVal"].Success ? new Quantity { Value = Convert.ToDecimal(match.Groups["LeftVal"].Value, culture) } : null; High = match.Groups["Operator"].Value == "<" ? new Quantity { Value = Convert.ToDecimal(match.Groups["LeftVal"].Value, culture) } : match.Groups["RightVal"].Success ? new Quantity { Value = Convert.ToDecimal(match.Groups["RightVal"].Value, culture) } : null; } else { Low = null; High = null; }
注意事项
如果你的业务场景中同时存在逗号作为千位分隔符、逗号作为小数分隔符的情况,需要额外调整数值的解析逻辑,避免转换错误。
内容的提问来源于stack exchange,提问作者Haukland
相关产品推荐
相关产品推荐

