我正在编写一个使用重命名规则的应用程序,根据用户提供的信息重命名文件列表.文件可能以不一致的名称开头,或者文件名可能是一致的.用户选择文件列表,并输入有关文件的信息(对于MP3,它们将是艺术家,标题,专辑等).使用重命名规则(例如下面的代码),程序使用用户输入的信息相应地重命名文件.
但是,如果所有或部分文件都是一致的,我想让程序"猜测"文件信息.这就是我遇到的问题.做这个的最好方式是什么?
示例文件名:
Kraftwerk-Kraftwerk-01-RuckZuck.mp3
Kraftwerk-Autobahn-01-Autobahn.mp3
Kraftwerk-Computer World-03-Numbers.mp3
Run Code Online (Sandbox Code Playgroud)
重命名规则:
%Artist%-%Album%-%Track%-%Title%.mp3
Run Code Online (Sandbox Code Playgroud)
该程序应正确推断艺术家,曲目编号,标题和专辑名称.
同样,最好的方法是什么?我在思考正则表达式,但我有点困惑.
最简单的方法是将每个%Label%字符替换为(?<Label>.*?),并转义任何其他字符。
%Artist%-%Album%-%Track%-%Title%.mp3
Run Code Online (Sandbox Code Playgroud)
变成
(?<Artist>.*?)-(?<Album>.*?)-(?<Track>.*?)-(?<Title>.*?)\.mp3
Run Code Online (Sandbox Code Playgroud)
然后,您可以将每个组件放入命名的捕获组中。
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;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果用户遗漏了分隔符,或者分隔符可能包含在字段中,则可能会得到一些奇怪的结果。该模式将%Artist%%Album%成为(?<Artist>.*?)(?<Album>.*?)相当于.*?.*?。该模式不知道在哪里分裂。
如果您知道某些字段的格式(例如曲目编号),则可以解决此问题。如果您改为转换%Track%为(?<Track>\d+),该模式将知道文件名中的任何数字都必须是Track.