簡體   English   中英

模式匹配和占位符值

[英]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

不是你問的問題的答案,但是當你使用MP3時, ID3標簽閱讀庫可能是更好的方法。 一個快速的谷歌想出了: C#ID3庫

至於猜測哪些字符串位置包含藝術家,專輯和歌曲標題......我能想到的第一件事是,如果你有一個很好的選擇,比如幾張專輯,你可以先看看哪個位置重復最多,這將是藝術家,重復第二多(專輯),並重復最少(歌曲標題)。

否則,僅根據文件名中的幾個字符串進行制作似乎是一個困難的猜測...您是否可以要求用戶同時輸入描述字段順序的文件名的匹配表達式?

您的示例中的文件名對我來說似乎非常一致。 您可以簡單地執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM