首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式匹配和占位符值

问模式匹配和占位符值
EN

Stack Overflow用户
提问于 2008-10-30 21:00:11
回答 4查看 2.5K关注 0票数 7

我正在编写一个应用程序,它使用重命名规则根据用户提供的信息重命名文件列表。文件的名称可能一开始就不一致,或者文件名可能不一致。用户选择一个文件列表,并输入有关这些文件的信息(对于MP3s,它们将是艺术家、标题、专辑等)。使用重命名规则(下面的示例),程序使用用户输入的信息相应地重命名文件。

但是,如果所有或部分文件的名称一致,我希望允许程序“猜测”文件信息。这就是我遇到的问题。做这件事最好的方法是什么?

示例文件名:

代码语言:javascript
复制
Kraftwerk-Kraftwerk-01-RuckZuck.mp3
Kraftwerk-Autobahn-01-Autobahn.mp3
Kraftwerk-Computer World-03-Numbers.mp3

重命名规则:

代码语言:javascript
复制
%Artist%-%Album%-%Track%-%Title%.mp3

程序应该正确地推断出艺术家、曲目编号、标题和专辑名称。

再问一次,做这件事的最好方法是什么?我在考虑正则表达式,但我有点困惑。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-10-30 21:52:03

最简单的方法是用(?<Label>.*?)替换每个%Label%,并转义任何其他字符。

代码语言:javascript
复制
%Artist%-%Album%-%Track%-%Title%.mp3

变成了

代码语言:javascript
复制
(?<Artist>.*?)-(?<Album>.*?)-(?<Track>.*?)-(?<Title>.*?)\.mp3

然后,您可以将每个组件放入命名捕获组。

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2008-10-30 21:05:48

这不是您提出的问题的答案,但是当您使用MP3s时,ID3 tag阅读库可能是一种更好的方法。谷歌很快就想出了:C# ID3 Library。

至于猜测哪个字符串位置保存了艺术家、专辑和歌名...我能想到的第一件事是,如果你有一个很好的选择,比如说几张专辑,你可以首先看到哪个位置重复最多,哪个是艺术家,哪个重复第二多(专辑),哪个重复最少(歌名)。

否则,仅根据文件名中的几个字符串进行猜测似乎很困难……您是否可以要求用户也为描述字段顺序的文件名输入一个匹配表达式?

票数 1
EN

Stack Overflow用户

发布于 2008-10-30 21:45:38

在我看来,您示例中的文件名非常一致。您可以简单地执行string.Split()并将结果数组的每个元素添加到相应的标记信息中。

猜测哪个位置是哪个标签信息将涉及大量的启发式方法。

顺便说一句。包含歌曲文件的文件夹通常在其名称中也有一些模式,f.e.。

1998 -7

1999年--潜望镜

2000 -- CO2

这里的格式是%Year% -%AlumName%,这可能有助于您识别文件名中的哪个元素是专辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/251759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档