我对正则表达式没有太多经验,我想纠正这一点。我决定构建一个采用目录名称的应用程序,扫描所有文件(所有文件都有不断增加的序列号,但文件名不同。示例:episode01.mp4
,episode_02.mp4
,episod03.mp4
, episode04.rmvb
等。)
应用程序应扫描目录,找到每个文件名中的数字,并将扩展名重命名为通用格式(episode01.mp4
,episode02.mp4
,episode03.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
)
答案 0 :(得分:1)
这个最简单的解决方案可能是使用Path.GetFileNameWithoutExtension
来获取文件名,然后使用正则表达式\d+$
来获取数字(或Path.GetExtension
和\d+
获取任何地方的数字。)
您也可以通过一次替换来实现这一目标:
Regex.Replace(fileName, @".*?(\d+).*(\.[^.]+)$", "Episode$1$2")
这个正则表达式更好一点,因为它强制扩展不包含点。