[英]Pattern matching and placeholder values
我正在編寫一個使用重命名規則的應用程序,根據用戶提供的信息重命名文件列表。 文件可能以不一致的名稱開頭,或者文件名可能是一致的。 用戶選擇文件列表,並輸入有關文件的信息(對於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
。
您的示例中的文件名對我來說似乎非常一致。 您可以簡單地執行string.Split()並將結果數組的每個元素添加到其相應的標記信息中。
猜測哪個標簽信息將涉及啟發式的TONS。
順便說一句。 包含歌曲文件的文件夾通常在其名稱中也有一些模式,fe
1998年 - 七
1999年 - 潛望鏡
2000年 - 二氧化碳
此處的格式為%Year% - %AlbumName%,可幫助您確定文件名中的哪個元素是相冊。
為了澄清, 我有一個模式來對匹配文件名。
我提前知道文件名或模式,它都是運行時。
圖案:
%Artist%-%Album%-%Track%-%Title%.mp3
文件名:
Kraftwerk-Kraftwerk-01-RuckZuck.mp3 Kraftwerk-Autobahn-01-Autobahn.mp3 Kraftwerk-Computer World-03-Numbers.mp3
預期結果:
Artist Album Track Title Kraftwerk Kraftwerk 01 RuckZuck Kraftwerk Autobahn 01 Autobahn Kraftwerk Computer World 01 Numbers
同樣,格式和文件名並不總是相同。
我編寫了一個命令行文件重命名器--- RenameWand ---它可以完成你所描述的那種模式匹配。 雖然它在Java中,但我認為您可能會對某些源代碼和使用文檔感興趣。 程序可以做的一個簡單示例:
源模式(用戶指定):
<artist>-<album>-<track>-<title>.mp3
目標模式(用戶指定):
<title.upper>-<3|track+10>-<album.lower>-<artist>.mp3
原始文件名:
Kraftwerk-Computer World-03-Numbers.mp3
重命名文件名:
NUMBERS-013-computer world-Kraftwerk.mp3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.