如何从C#的string.Format格式串与结果串中提取指定位置数字
提取格式化字符串中占位符对应的原始数字
嘿,针对你这个需求,我整理了几个实用的解决方案,从简单到通用都有,你可以根据自己的场景选:
方案一:固定格式下的快速拆分法
因为你的格式是固定的,{1:d3}刚好位于.和/之间,直接拆分字符串就能拿到目标部分:
string formattedStr = "PC070518.001/05H"; // 第一步:按`.`拆分,取第二个部分 var middlePart = formattedStr.Split('.')[1]; // 第二步:按`/`拆分,取第一个部分(就是带前导零的数字) var paddedNumber = middlePart.Split('/')[0]; // 转成整数,自动去掉前导零得到原始数字 int originalNumber = int.Parse(paddedNumber); // 此时originalNumber的值就是1
这个方法简单粗暴,代码量少,但只适合固定不变的格式,如果格式字符串有修改,就得跟着改代码。
方案二:正则表达式匹配法
如果格式可能有小变动(比如日期部分的格式不变,但前后文本微调),用正则更灵活。我们可以匹配PC开头的日期、.、三位数字、/这个结构,捕获中间的三位数字:
using System.Text.RegularExpressions; string formattedStr = "PC070518.001/05H"; // 正则规则:PC + 6位日期数字 + . + 捕获3位数字 + / Match matchResult = Regex.Match(formattedStr, @"PC\d{6}\.(\d{3})/"); if (matchResult.Success) { int originalNumber = int.Parse(matchResult.Groups[1].Value); // 同样得到原始数字1 }
这个方法比拆分法适应性强一点,只要日期部分始终是6位数字,就能正常捕获目标。
方案三:通用格式解析法(适配格式变化)
如果你的格式字符串可能经常调整,或者需要适配多种类似格式,那可以通过解析格式字符串本身,找到{1:d3}的前后分隔符,再去结果串中定位:
string formatStr = "PC{0:ddMMyy}.{1:d3}/{2:MM}H"; string formattedStr = "PC070518.001/05H"; // 找到目标占位符在格式串中的位置 int placeholderPos = formatStr.IndexOf("{1:d3}"); // 提取占位符前面的分隔文本(这里是`.`) string prefix = formatStr.Substring(0, placeholderPos).Split('}').Last(); // 提取占位符后面的分隔文本(这里是`/`) string suffix = formatStr.Substring(placeholderPos + "{1:d3}".Length).Split('{').First(); // 在结果串中定位分隔符的位置,截取中间的数字部分 int start = formattedStr.IndexOf(prefix) + prefix.Length; int end = formattedStr.IndexOf(suffix, start); string paddedNumber = formattedStr.Substring(start, end - start); int originalNumber = int.Parse(paddedNumber); // 最终得到原始数字1
这个方法的优势在于不需要硬编码格式细节,只要格式串里的占位符前后有明确的分隔文本,就能自动提取,扩展性更好。
内容的提问来源于stack exchange,提问作者smart duong
相关产品推荐
相关产品推荐

