You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:06:01