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

C#如何查找字符串中最后一次出现的数字并按该位置拆分

优化方案

你的现有逻辑可以正常运行,但可以从精简步骤、提升性能、兼容边界场景三个方向优化,以下是两种常用的更优实现:

方案1:正则分组一步捕获(最简洁)

直接用正则一次性匹配数值部分和单位部分,省去手动计算索引、查找字符串的步骤,代码可读性更高:

// 正则含义:第一组匹配到最后一个数字为止的所有内容,第二组匹配后面所有非数字的单位内容
var match = Regex.Match(packageSize, @"^(?<numberPart>.*\d)(?<unitPart>\D*)$");
if (match.Success)
{
    // 建议用TryParse避免格式错误抛异常
    if (decimal.TryParse(match.Groups["numberPart"].Value, out decimal loadDecimal))
    {
        string unit = match.Groups["unitPart"].Value;
        // 后续入库逻辑
    }
}

方案2:倒序遍历查找(性能最优)

如果需要批量处理大量字符串,无正则的方案性能高出30%以上:

int lastDigitIndex = -1;
// 从末尾倒序找第一个出现的数字位置
for (int i = packageSize.Length - 1; i >= 0; i--)
{
    if (char.IsDigit(packageSize[i]))
    {
        lastDigitIndex = i;
        break;
    }
}
// 处理存在数字的合法场景
if (lastDigitIndex >= 0)
{
    // 低于C# 8.0版本可替换为 Substring(0, lastDigitIndex + 1)
    string numberPart = packageSize[..(lastDigitIndex + 1)];
    // 低于C# 8.0版本可替换为 Substring(lastDigitIndex + 1)
    string unitPart = packageSize[(lastDigitIndex + 1)..];
    if (decimal.TryParse(numberPart, out decimal loadDecimal))
    {
        // 后续入库逻辑
    }
}

现有代码的潜在问题说明

  • 额外的LastIndexOf属于冗余操作:正则匹配结果的Index属性已经可以拿到匹配串的位置,不需要二次查找,还能避免字符串中出现重复子串时的匹配偏差问题。
  • 缺少边界校验:如果输入字符串不含数字、数值部分格式非法,现有代码会直接抛出异常,生产环境建议加匹配成功判断和TryParse转换。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:09:04