Проблема при создании регулярного выражения в соответствии с именем файла - PullRequest
1 голос
/ 01 сентября 2009

Я пытаюсь создать регулярное выражение в C #, чтобы извлечь исполнителя, номер дорожки и название песни из имени файла, такого как: 01.artist - title.mp3

Сейчас я не могу заставить это работать, и у меня проблемы с поиском нужной помощи в Интернете.

Вот что у меня есть:

string fileRegex = "(?<trackNo>\\d{1,3})\\.(<artist>[a-z])\\s-\\s(<title>[a-z])\\.mp3";
Regex r = new Regex(fileRegex);
Match m = r.Match(song.Name); // song.Name is the filname
if (m.Success)
{
    Console.WriteLine("Artist is {0}", m.Groups["artist"]);
}
else
{
    Console.WriteLine("no match");
}

Я не получаю никаких совпадений, и вся помощь приветствуется!

Ответы [ 4 ]

2 голосов
/ 01 сентября 2009

Возможно, вы захотите поставить? Перед тегами <> во всех ваших группах и поставить знак + после ваших [a-z], например, так:

string fileRegex = "(?<trackNo>\\d{1,3})\\.(?<artist>[a-z]+)\\s-\\s(?<title>[a-z]+)\\.mp3";

Тогда это должно работать. Символы? Необходимы для того, чтобы содержимое угловых скобок <> интерпретировалось как имя группы, а символы + должны соответствовать 1 или более повторениям последнего элемента, который представляет собой любой символ между (и включая) Я здесь.

1 голос
/ 01 сентября 2009

Ваш артист и титульные группы соответствуют ровно одному персонажу. Попробуйте:

"(?<trackNo>\\d{1,3})\\.(?<artist>[a-z]+\\s-\\s(?<title>[a-z]+)\\.mp3"

Я действительно рекомендую http://www.ultrapico.com/Expresso.htm для построения регулярных выражений. Это великолепно и бесплатно.

P.S. мне нравится вводить строковые литералы регулярных выражений примерно так:

@"(?<trackNo>\d{1,3})\.(?<artist>[a-z]+\s-\s(?<title>[a-z]+)\.mp3"
0 голосов
/ 01 сентября 2009

КОД

String fileName = @"01. Pink Floyd - Another Brick in the Wall.mp3";
String regex = @"^(?<TrackNumber>[0-9]{1,3})\. ?(?<Artist>(.(?!= - ))+) - (?<Title>.+)\.mp3$";

Match match = Regex.Match(fileName, regex);

if (match.Success)
{
    Console.WriteLine(match.Groups["TrackNumber"]);
    Console.WriteLine(match.Groups["Artist"]);
    Console.WriteLine(match.Groups["Title"]);
}

OUTPUT

01
Pink Floyd
Another Brick in the Wall
0 голосов
/ 01 сентября 2009

Может быть попробовать:

"(?<trackNo>\\d{1,3})\\.(<artist>[a-z]*)\\s-\\s(<title>[a-z]*)\\.mp3";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...