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
相关产品推荐
相关产品推荐

