Это сложно объяснить достаточно, чтобы задать вопрос, но я попробую:
У меня есть две возможности пользовательского ввода:
S01E05 или 0105 (две разные строки ввода)
, которые оба переводятся в сезон 01, эпизод 05
, но если они вводят его в обратном направлении E05S01 или 0501, мне нужно иметь возможность вернуть тот же результат, сезон 01, эпизод 05
Элементом управления для этого будет пользователь, определяющий формат исходного имени файла примерно так: «SssEee» - прописные буквы «S», обозначающие принадлежность следующих строчных букв «Season», и прописные буквы «E», обозначающие, чтоСледующие строчные 'е' принадлежат Эпизоду.Так что, если пользователь решит определить формат как EeeSss, тогда моя функция все равно должна вернуть тот же результат, так как он знает, какие числа принадлежат сезону или эпизоду.
У меня пока нет ничего работающего, чтобы поделиться, ноя играл с циклом, который строит шаблон регулярных выражений.Пока что функция принимает формат пользователя и имя файла:
public static int(string userFormat, string fileName)
{
}
userFormat будет строкой и будет выглядеть примерно так:
tttSssEee
или даже
t.SssEee
где t для заголовка, а остальное вы знаете.
Имя файла можетвыглядят так:
battlestar.galactica.S01E05.mkv
Я получил функцию, которая извлекает заголовок из имени файла, используя userFormat для построения строки регулярного выражения
public static string GetTitle(string userFormat, string fileName)
{
string pattern = "^";
char positionChar;
string fileTitle;
for (short i = 0; i < userFormat.Length; i++)
{
positionChar = userFormat[i];
//build the regex pattern
if (positionChar == 't')
{
pattern += @"\w+";
}
else if (positionChar == '#')
{
pattern += @"\d+";
}
else if (positionChar == ' ')
{
pattern += @"\s+";
}
else
pattern += positionChar;
}
//pulls out the title with or without the delimiter
Match title = Regex.Match(fileName, pattern, RegexOptions.IgnoreCase);
fileTitle = title.Groups[0].Value;
//remove the delimiter
string[] tempString = fileTitle.Split(@"\/.-<>".ToCharArray());
fileTitle = "";
foreach (string part in tempString)
{
fileTitle += part + " ";
}
return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fileTitle);
}
но я вроде как озадачен тем, как сделать извлечение номера эпизода и сезона.В моей голове я думаю, что процесс будет выглядеть примерно так:
- Просмотрите строку userFormat, чтобы найти заглавные буквы S
- Определите, сколько строчных букв следует за заглавными S
- Создание выражения регулярного выражения, которое описывает это
- Поиск по имени файла и поиск этого шаблона
- Извлечение числа из этого шаблона
Звучит простоДостаточно, но я испытываю затруднения, заставляя это действоватьСложность заключается в том, что формат имени файла может быть S01E05 или просто 0105. Любой сценарий будет определен пользователем при определении формата.
Пример 1. файлимя Battlestar.galactica.S01E05
отправленный пользовательский формат будет tt? ss? ee
Ex 2. имя файла battlestar.galactica.0105
отправленный пользовательский формат будет ttSssEee
Ex 3. имя файла battlestar.galactica.0501
отправленный пользовательский формат будетttEeeSss
Извините за книгу ... концепция проста, функция регулярного выражения должна быть динамической, позволяющей пользователю определять формат имени файла, в котором мой метод может сгенерировать выражение, и использовать его для извлеченияинформация из имени файла.Что-то говорит мне, что это проще, чем кажется ... но я в растерянности.лол ... есть предложения?