如何不使用正则表达式从指定格式文件名中提取.txt前的目标数字
无正则实现方案
核心逻辑对齐
把原有正则的匹配规则拆解为直白的字符串处理规则,保证和原逻辑输出100%一致:
- 仅处理纯文件名部分,忽略文件路径中的下划线、数字干扰
- 仅识别紧贴扩展名前的最后一个下划线,这个下划线后面的字符串如果是纯数字,就提取这个数字作为结果
- 所有不满足上述条件的场景,统一返回0
实现步骤
- 借助.NET内置的Path类方法剥离路径、剥离扩展名,拿到不带后缀的文件名主体,避免手写字符串分割的边界问题
- 查找文件名主体中最后一个下划线的索引位置,如果找不到下划线,直接返回0
- 截取最后一个下划线后方的所有子串,尝试把这个子串转换为整数
- 转换成功就返回这个整数值,转换失败(比如子串带字母、为空)就返回0
参考实现代码
int ExtractIdFromFileName(string fullFileName) { // 剥离路径干扰,只保留纯文件名 string pureFileName = Path.GetFileName(fullFileName); // 剥离文件扩展名,得到不带后缀的文件名主体 string fileNameWithoutExt = Path.GetFileNameWithoutExtension(pureFileName); // 查找文件名主体中最后一个下划线的位置 int lastUnderscorePos = fileNameWithoutExt.LastIndexOf('_'); // 不存在下划线时直接返回0,和原正则逻辑对齐 if (lastUnderscorePos < 0) return 0; // 截取最后一个下划线后方的候选字符串 string candidateNumStr = fileNameWithoutExt.Substring(lastUnderscorePos + 1); // 尝试转换为整数,转换成功返回数值,否则返回0 return int.TryParse(candidateNumStr, out int id) ? id : 0; }
示例验证
对照给定的测试用例逐一校验输出:
- 输入
abc_d1.txt:截取的候选串是d1,转换失败返回0 → 匹配预期 - 输入
abc_d1_2.txt:截取的候选串是2,转换成功返回2 → 匹配预期 - 输入
abc_d1_14.txt:截取的候选串是14,转换成功返回14 → 匹配预期 - 输入
abc_d12_x2_156.txt:截取的候选串是156,转换成功返回156 → 匹配预期
方案优势
- 无正则引擎的初始化、匹配开销,高频调用场景性能更优
- 逻辑直白无黑盒,后续调整提取规则时修改成本低
- 依赖.NET内置的路径处理API,不会出现跨平台的路径分隔符兼容问题
内容的提问来源于stack exchange,提问作者user10860402
相关产品推荐
相关产品推荐

