Замена условного регулярного выражения в C # без MatchEvaluator - PullRequest
1 голос
/ 16 июня 2010

Итак, я пытаюсь создать программу для переименования некоторых файлов. По большей части я хочу, чтобы они выглядели так:

[Тестирование] StupidName - 2 [720p] .mkv

Но я хотел бы иметь возможность изменить формат, если это необходимо. Если я использую MatchEvaluators, вам придется каждый раз перекомпилировать. Вот почему я не хочу использовать MatchEvaluator.

Проблема, с которой я столкнулся, заключается в том, что я не знаю, как или, если возможно, сказать Заменить, что, если группа была найдена, включите эту строку. Единственный синтаксис, который я когда-либо видел, был что-то вроде (?<group>:data), но я не могу заставить это работать. Ну, если у кого-то есть идея, я все за нее.

EDIT:

регулярные выражения захвата тока =

^(\[(?<FanSub>[^\]\)\}]+)\])?[. _]*(?<SeriesTitle>[\w. ]*?)[. _]*\-[. _]*(?<EpisodeNumber>\d+)[. _]*(\-[. _]*(?<EpisodeName>[\w. ]*?)[. _]*)?([\[\(\{](?<MiscInfo>[^\]\)\}]*)[\]\)\}][. _]*)*[\w. ]*(?<Extension>\.[a-zA-Z]+)$

^(?<SeriesTitle>[\w. ]*?)[. _]*[Ss](?<SeasonNumber>\d+)[Ee](?<EpisodeNumber>\d+).*?(?<Extension>\.[a-zA-Z]+)$    

^(?<SeriesTitle>[\w. ]*?)[. _]*(?<SeasonNumber>\d)(?<EpisodeNumber>\d{2}).*?(?<Extension>\.[a-zA-Z]+)$

Текущий Regex = [${FanSub}]${SeriesTitle} - ${EpisodeNumber} [${MiscInfo}]${Extension}

Используя Regex.Replace, файл TestFile 101.mkv, я получаю []TestFile - 1[].mkv. Я хочу сделать так, чтобы [] был включен только в том случае, если была найдена группа FanSub или MiscInfo.

Я могу решить эту проблему с помощью MatchEvaluator, потому что я на самом деле могу скомпилировать функцию. Но это не будет простым решением для пользователей программы. Единственная другая идея, которую мне нужно решить, - это создать собственную функцию Regex.Replace, которая принимает специальный синтаксис.

1 Ответ

0 голосов
/ 16 июня 2010

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

Возможно, одно решение состоит в том, чтобы разбить части вашего имени файла на определенные группы, а затем передать шаблон замены, который использует преимущества этих имен групп. Это даст вам возможность передавать различные шаблоны замены, которые возвращают желаемую структуру имени файла, используя метод Regex.Replace .

Поскольку вы не объяснили категории своего имени файла, я придумал несколько случайных групп для демонстрации. Вот быстрый пример:

string input = "Testing StupidName Number2 720p.mkv";
string pattern = @"^(?<Category>\w+)\s+(?<Name>.+?)\s+Number(?<Number>\d+)\s+(?<Resolution>\d+p)(?<Extension>\.mkv)$";

string[] replacePatterns =
{
    "[${Category}]${Name} - ${Number}[${Resolution}]${Extension}",
    "${Category} - ${Name} - ${Number} - ${Resolution}${Extension}",
    "(${Number}) - [${Resolution}] ${Name} [${Category}]${Extension}"
};

foreach (string replacePattern in replacePatterns)
{
    Console.WriteLine(Regex.Replace(input, pattern, replacePattern));
}

Как показано в примере, именованные группы в шаблоне, указанные как (?<Name>pattern), упоминаются в шаблоне замены как ${Name}.

При таком подходе вам необходимо заранее знать имена групп и передавать их, чтобы изменить порядок шаблонов по мере необходимости.

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