найти номер в имени файла с помощью регулярных выражений - PullRequest
2 голосов
/ 27 июля 2010

У меня нет большого опыта с регулярными выражениями, и я хотел исправить это.Я решил создать приложение, которое принимает имя каталога, сканирует все файлы (все серийные номера которых увеличиваются, но слегка различаются по именам. Пример: episode01.mp4, episode_02.mp4, episod03.mp4, episode04.rmvb и т. Д.)

Приложение должно сканировать каталог, найти номер в каждом имени файла и переименовать файл с расширением в общий формат (episode01.mp4, episode02.mp4, episode03.mp4, 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
}

Одна проблема в этом коде состоит в том, что он также включает файлы, которые не имеют номеров в renameDictionary.Было бы также полезно, если бы вы указали на любые другие ошибки, с которыми мне следует быть осторожными.

PS: я предполагаю, что имена файлов будут содержать только числа, соответствующие серийным номерам (ничего подобного cam7_0001.jpg)

1 Ответ

1 голос
/ 27 июля 2010

Это простейшее решение, вероятно, состоит в том, чтобы использовать Path.GetFileNameWithoutExtension для получения имени файла, а затем регулярное выражение \d+$ для получения номера в конце (или Path.GetExtension и \d+ для получения номера в любом месте).

Вы также можете добиться этого за одну замену:

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

Это регулярное выражение немного лучше, так как оно заставляет расширение не содержать точек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...