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

C#正则批量重命名文件:移除文件名末尾_6位数字.xml部分

搞定C#文件重命名的正则问题

嘿,我来帮你排查下代码里的问题,你现在的代码没法正常工作主要有几个点:

  • 写的正则完全不对路:(\\[_\d]\\s)这个表达式根本匹配不了_xxxxxx.xml的格式,语法和逻辑都跑偏了
  • 直接替换f.FullName会把文件所在的路径也改掉,这可不是你要的,咱们应该只改文件名本身
  • 还有那个temp变量根本没定义,Regex.Replace的第二个参数得是你要替换成的内容呀

正确的实现思路

咱们一步步来:

  1. 先写对正则:要匹配文件名末尾的_6位数字.xml,应该用@"_(\d{6})\.xml$"。拆解下:
    • _:精准匹配下划线
    • (\d{6}):捕获6位数字(括号只是让结构更清晰,其实可以省略)
    • \.xml:匹配.xml,这里点号要转义,不然正则会把它当成任意字符
    • $:锚定到字符串末尾,确保只改文件名最后那部分
  2. 只处理文件名:别碰完整路径,用f.Name来做替换,然后用Path.Combine把原目录和新文件名拼起来,避免路径出错
  3. 先判断再操作:先检查文件名是否符合规则,别对所有文件都瞎替换
  4. 加个异常捕获:防止文件被占用、没权限这些情况搞崩程序

修正后的完整代码

using System;
using System.IO;
using System.Text.RegularExpressions;

private static void RenameFiles(string outputPath)
{
    DirectoryInfo d = new DirectoryInfo(outputPath);
    // 先过滤出xml文件,不用遍历所有文件,效率更高
    FileInfo[] infos = d.GetFiles("*.xml");
    
    foreach (FileInfo f in infos)
    {
        string pattern = @"_(\d{6})\.xml$";
        // 先确认文件名符合规则再动手
        if (Regex.IsMatch(f.Name, pattern))
        {
            // 只替换文件名部分,保留原路径
            string newFileName = Regex.Replace(f.Name, pattern, ".xml");
            string newFullPath = Path.Combine(d.FullName, newFileName);
            
            try
            {
                File.Move(f.FullName, newFullPath);
                Console.WriteLine($"搞定:{f.Name} → {newFileName}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"重命名失败[{f.Name}]:{ex.Message}");
            }
        }
    }
}

为啥这么写?

  • d.GetFiles("*.xml"):只遍历xml文件,少做无用功
  • Regex.IsMatch:先筛一遍,避免对不符合规则的文件做替换操作
  • Path.Combine:比手动拼路径靠谱多了,自动处理斜杠这些细节
  • 异常捕获:遇到文件被打开、权限不够这些情况,程序不会直接崩,还能告诉你为啥失败

拿你举的例子filename_A_123_456789.xml来说,正则会精准匹配末尾的_456789.xml,替换成.xml,最后就得到filename_A_123.xml,完全符合你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:01:19