使用正则表达式在文件名中查找数字

时间:2010-07-27 10:20:49

标签: c# regex filenames

我对正则表达式没有太多经验,我想纠正这一点。我决定构建一个采用目录名称的应用程序,扫描所有文件(所有文件都有不断增加的序列号,但文件名不同。示例:episode01.mp4episode_02.mp4episod03.mp4episode04.rmvb等。)

应用程序应扫描目录,找到每个文件名中的数字,并将扩展名重命名为通用格式(episode01.mp4episode02.mp4episode03.mp4,{{ 1}}等。

我有以下代码:

episode04.rmvb

此代码中的一个问题是它还包含Dictionary<string, string> renameDictionary = new Dictionary<string,string>(); DirectoryInfo dInfo = new DirectoryInfo(path); string newFormat = "Episode{0}.{1}"; Regex regex = new Regex(@".*?(?<no>\d+).*?\.(?<ext>.*)"); //look for a number(before .) aext: *(d+)*.* foreach (var file in dInfo.GetFiles()) { string fileName = file.Name; var match = regex.Match(fileName); if (match != null) { GroupCollection gc = match.Groups; //Console.WriteLine("Number : {0}, Extension : {2} found in {1}.", gc["no"], fileName,gc["ext"]); renameDictionary[fileName] = string.Format(newFormat, gc["no"], gc["ext"]); } } foreach (var renamePair in renameDictionary) { Console.WriteLine("{0} will be renamed to {1}.", renamePair.Key, renamePair.Value); //stuff for renaming here } 中没有数字的文件。如果你能指出我应该注意的任何其他问题也会有所帮助。

PS:我假设文件名只包含与序列对应的数字(不像renameDictionary

1 个答案:

答案 0 :(得分:1)

这个最简单的解决方案可能是使用Path.GetFileNameWithoutExtension来获取文件名,然后使用正则表达式\d+$来获取数字(或Path.GetExtension\d+获取任何地方的数字。)

您也可以通过一次替换来实现这一目标:

Regex.Replace(fileName, @".*?(\d+).*(\.[^.]+)$", "Episode$1$2")

这个正则表达式更好一点,因为它强制扩展不包含点。