模式匹配和占位符值
我正在编写一个应用程序,它使用重命名规则根据用户给出的信息重命名文件列表。 这些文件可能会以不一致的名字开头,或者文件名可能一致。 用户选择文件列表,并输入关于文件的信息(对于MP3,它们将是艺术家,标题,专辑等)。 使用重命名规则(下面的示例),程序使用用户输入的信息来相应地重命名文件。
但是,如果所有或部分文件的名称一致,我想让程序“猜测”文件信息。 这是我遇到的问题。 做这个的最好方式是什么?
示例文件名:
Kraftwerk-Kraftwerk-01-RuckZuck.mp3
Kraftwerk-Autobahn-01-Autobahn.mp3
Kraftwerk-Computer World-03-Numbers.mp3
重命名规则:
%Artist%-%Album%-%Track%-%Title%.mp3
该节目应正确推断出艺术家,曲目编号,标题和专辑名称。
再次,做这件事的最好方法是什么? 我在想正则表达式,但我有点困惑。
最简单的方法是用(?<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
。
不是您询问的问题的答案,但是当您使用MP3时,ID3标签阅读库可能是更好的方法。 快速Google提出了:C#ID3库。
至于猜测艺术家,专辑和歌曲标题的哪个字符串位置......我能想到的第一件事是,如果你有很好的选择可以使用,比如说几张专辑,你可以首先看到哪个位置重复最多,这将是艺术家,重复第二多(专辑),并重复最少(歌曲标题)。
否则,似乎很难根据文件名中的几个字符串进行猜测......您是否可以要求用户输入描述字段顺序的文件名的匹配表达式?
你的例子中的文件名对我来说看起来很一致。 您可以简单地执行string.Split()并将结果数组的每个元素添加到其相应的标记信息中。
猜测哪个位置是哪个标签信息会涉及启发式的TONS。
顺便说一句。 包含歌曲文件的文件夹通常在名称中也有一些格式,例如fe
1998年 - 七
1999年 - 潜望镜
2000 - 二氧化碳
这里的格式是%Year% - %AlbumName%,它可以帮助您识别文件名中的哪个元素是专辑。
链接地址: http://www.djcxy.com/p/41929.html