模式匹配和占位符值

Mik*_*sen 7 c# regex

我正在编写一个使用重命名规则的应用程序,根据用户提供的信息重命名文件列表.文件可能以不一致的名称开头,或者文件名可能是一致的.用户选择文件列表,并输入有关文件的信息(对于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)

该程序应正确推断艺术家,曲目编号,标题和专辑名称.

同样,最好的方法是什么?我在思考正则表达式,但我有点困惑.

Mar*_*rot 3

最简单的方法是将每个%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.