C#正则批量重命名文件:移除文件名末尾_6位数字.xml部分
搞定C#文件重命名的正则问题
嘿,我来帮你排查下代码里的问题,你现在的代码没法正常工作主要有几个点:
- 写的正则完全不对路:
(\\[_\d]\\s)这个表达式根本匹配不了_xxxxxx.xml的格式,语法和逻辑都跑偏了 - 直接替换
f.FullName会把文件所在的路径也改掉,这可不是你要的,咱们应该只改文件名本身 - 还有那个
temp变量根本没定义,Regex.Replace的第二个参数得是你要替换成的内容呀
正确的实现思路
咱们一步步来:
- 先写对正则:要匹配文件名末尾的
_6位数字.xml,应该用@"_(\d{6})\.xml$"。拆解下:_:精准匹配下划线(\d{6}):捕获6位数字(括号只是让结构更清晰,其实可以省略)\.xml:匹配.xml,这里点号要转义,不然正则会把它当成任意字符$:锚定到字符串末尾,确保只改文件名最后那部分
- 只处理文件名:别碰完整路径,用
f.Name来做替换,然后用Path.Combine把原目录和新文件名拼起来,避免路径出错 - 先判断再操作:先检查文件名是否符合规则,别对所有文件都瞎替换
- 加个异常捕获:防止文件被占用、没权限这些情况搞崩程序
修正后的完整代码
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
相关产品推荐
相关产品推荐

