我正在编写一个应用程序,它使用重命名规则根据用户提供的信息重命名文件列表。文件的名称可能一开始就不一致,或者文件名可能不一致。用户选择一个文件列表,并输入有关这些文件的信息(对于MP3s,它们将是艺术家、标题、专辑等)。使用重命名规则(下面的示例),程序使用用户输入的信息相应地重命名文件。
但是,如果所有或部分文件的名称一致,我希望允许程序“猜测”文件信息。这就是我遇到的问题。做这件事最好的方法是什么?
示例文件名:
Kraftwerk-Kraftwerk-01-RuckZuck.mp3
Kraftwerk-Autobahn-01-Autobahn.mp3
Kraftwerk-Computer World-03-Numbers.mp3重命名规则:
%Artist%-%Album%-%Track%-%Title%.mp3程序应该正确地推断出艺术家、曲目编号、标题和专辑名称。
再问一次,做这件事的最好方法是什么?我在考虑正则表达式,但我有点困惑。
发布于 2008-10-30 21:52:03
最简单的方法是用(?<Label>.*?)替换每个%Label%,并转义任何其他字符。
%Artist%-%Album%-%Track%-%Title%.mp3变成了
(?<Artist>.*?)-(?<Album>.*?)-(?<Track>.*?)-(?<Title>.*?)\.mp3然后,您可以将每个组件放入命名捕获组。
Dictinary<string,string> match_filename(string rule, string filename) {
Regex tag_re = new Regex(@'%(\w+)%');
string pattern = tag_re.Replace(Regex.escape(rule), @'(?<$1>.*?)');
Regex filename_re = new Regex(pattern);
Match match = filename_re.Match(filename);
Dictionary<string,string> tokens =
new Dictionary<string,string>();
for (int counter = 1; counter < match.Groups.Count; counter++)
{
string group_name = filename_re.GroupNameFromNumber(counter);
tokens.Add(group_name, m.Groups[counter].Value);
}
return tokens;
}但是,如果用户遗漏了分隔符,或者分隔符可以包含在字段中,您可能会得到一些奇怪的结果。%Artist%%Album%的模式将变成(?<Artist>.*?)(?<Album>.*?),相当于.*?.*?。模式将不知道在哪里拆分。
如果您知道某些字段的格式,例如跟踪编号,则可以解决此问题。如果将%Track%转换为(?<Track>\d+),则该模式将知道文件名中的任何数字都必须是Track。
发布于 2008-10-30 21:05:48
这不是您提出的问题的答案,但是当您使用MP3s时,ID3 tag阅读库可能是一种更好的方法。谷歌很快就想出了:C# ID3 Library。
至于猜测哪个字符串位置保存了艺术家、专辑和歌名...我能想到的第一件事是,如果你有一个很好的选择,比如说几张专辑,你可以首先看到哪个位置重复最多,哪个是艺术家,哪个重复第二多(专辑),哪个重复最少(歌名)。
否则,仅根据文件名中的几个字符串进行猜测似乎很困难……您是否可以要求用户也为描述字段顺序的文件名输入一个匹配表达式?
发布于 2008-10-30 21:45:38
在我看来,您示例中的文件名非常一致。您可以简单地执行string.Split()并将结果数组的每个元素添加到相应的标记信息中。
猜测哪个位置是哪个标签信息将涉及大量的启发式方法。
顺便说一句。包含歌曲文件的文件夹通常在其名称中也有一些模式,f.e.。
1998 -7
1999年--潜望镜
2000 -- CO2
这里的格式是%Year% -%AlumName%,这可能有助于您识别文件名中的哪个元素是专辑。
https://stackoverflow.com/questions/251759
复制相似问题