2009-09-01 69 views
1

我试图创建在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"); 
} 

我没有得到任何比赛都和所有帮助表示赞赏!

回答

2

你可能想要把的在所有分组的<>标记之前,并把后您的[A-Z] +号的,就像这样:

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

那么它应该工作。这些符号是必需的,以便角度括号<>的内容被解释为分组名称,并且+必须匹配最后一个元素的一个或多个重复,最后一个元素是(和包括)在这里。

0

也许尝试:

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

您的艺术家和标题组匹配一个字符。尝试:

"(?<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

+1为快报链接 – TLiebe 2009-09-01 15:53:11

0

CODE

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"]); 
} 

输出

 
01 
Pink Floyd 
Another Brick in the Wall