gpt4 book ai didi

c# - 模式匹配和占位符值

转载 作者:太空狗 更新时间:2023-10-29 20:32:41 29 4
gpt4 key购买 nike

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

关于c# - 模式匹配和占位符值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/251759/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com