模式匹配和占位符值

我正在编写一个应用程序,它使用重命名规则根据用户给出的信息重命名文件列表。 这些文件可能会以不一致的名字开头,或者文件名可能一致。 用户选择文件列表,并输入关于文件的信息(对于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

上一篇: Pattern matching and placeholder values

下一篇: Which is the best JSON rewriter for Java?