Замена / удаление определенной части имен файлов с помощью регулярных выражений - PullRequest
1 голос
/ 19 сентября 2019

Я новичок в C # и мне нужно пройтись по каталогу и удалить последнюю часть всех файлов, заканчивающихся на _xxxxxx.xml (подчеркивание, за которым следуют 6 цифр).

Например,имя файла filename_A_123_456789.xml становится filename_A_123.xml.

Что у меня есть до сих пор:

private static void RenameFiles(string outputPath)
{
    DirectoryInfo d = new DirectoryInfo(outputPath);
    FileInfo[] infos = d.GetFiles();
    foreach (FileInfo f in infos)
    {
        string newName = Regex.Replace(f.FullName, "(\\[_\d]\\s)", temp);

        File.Move(f.FullName, newName);
    }
}

Но это не работает.Анг CSharp Regexxers там?

Ответы [ 4 ]

1 голос
/ 19 сентября 2019

Регулярное выражение подходит для ваших нужд.В качестве альтернативы, вот решение без регулярных выражений, если вы хотите использовать его:

public static void Main()
{
    var source = @"filename_A_123_456789.xml";
    var slices =  Path.GetFileNameWithoutExtension(source).Split('_');
    var last = slices.Last();
    var isSpecific = last.Length == 6 && last.All(char.IsDigit);
    var result = string.Join("_", isSpecific ? slices.Take(slices.Length - 1) : slices) + Path.GetExtension(source);
    Console.WriteLine(result);
}
  • Мы разделим имя на '_'
  • Мы возьмем последний раздел
  • Мы определяем, является ли последний раздел определенной частью
  • Конкатим все обратно минус последний, если это конкретная часть

Попробуйте онлайн!

1 голос
/ 19 сентября 2019

Вы можете использовать регулярное выражение:

_\d{6}(\.[^.]+)$

и заменить вместо него $1.

Регулярное выражение соответствует 6 цифрам, тогда группа 1 ((\.[^.]+)) соответствует расширению, который вы заменяете в строке замены.Расширению соответствует «точка, за которой следует кучка не точек».Также обратите внимание, что конец строки привязывается $, чтобы утверждать, что все это должно быть в конце строки.

Измените свой код на:

string newName = Regex.Replace(f.FullName, @"_\d{6}(\.[^.]+)$", "$1");
0 голосов
/ 19 сентября 2019

Просто попробуйте:

string newName = Regex.Replace(f.FullName, "(\\_\\d{6}\\.xml)", ".xml");
0 голосов
/ 19 сентября 2019

Ваше регулярное выражение никак не определяет количество \d, чтобы определить, что вы ищете 6 цифр, чтобы быть точным.

Используйте это вместо:

(\S*)_\d{6}(\.xml) /m

Это регулярное выражение захватывает все непробельные символы перед _, за которым следуют шесть цифр и расширение .xml, в две отдельные группы захвата.

Затем замените на $1$2, после которой следует группа 1по группе 2.

Демо

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