パターンマッチングとプレースホルダー値
-
05-07-2019 - |
質問
ユーザーが指定した情報に基づいて、ファイルのリストの名前を変更するために名前変更ルールを使用するアプリケーションを作成しています。ファイルの名前が一貫していないか、ファイル名が一貫している可能性があります。ユーザーはファイルのリストを選択し、ファイルに関する情報を入力します(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
でなければならないことを認識します。
他のヒント
質問に対する答えではなく、 ID3タグの読み取りライブラリはMP3を使用しているときにこれを行うより良い方法。 Googleが簡単に思いついたのは、 C#ID3ライブラリです。
アーティスト、アルバム、曲のタイトルを保持する文字列の位置を推測するために...最初に考えることができるのは、いくつかのアルバムなどで作業する良い選択がある場合、最初にどの位置を見ることができるかということです最も多く繰り返されます。これはアーティストになり、2番目に多く繰り返されます(アルバム)、そして最も少なく繰り返されます(曲のタイトル)。
そうでなければ、ファイル名のいくつかの文字列だけに基づいて推測するのは難しいようです...フィールドの順序を説明するファイル名に一致する表現を入力するようにユーザーに依頼できますか?
あなたの例のファイル名は私にはかなり一貫しているようです。 string.Split()を実行するだけで、結果の配列の各要素を対応するタグ情報に追加できます。
どのタグ情報がどの位置にあるかを推測すると、ヒューリスティックのトンが含まれます。
ところで。歌のファイルを含むフォルダには、通常、名前にも何らかのパターンがあります。たとえば、
1998-Seven
1999-ペリスコープ
2000-CO2
ここでの形式は%Year%-%AlbumName%です。これは、ファイル名のどの要素がアルバムであるかを特定するのに役立ちます。
明確にするために、ファイル名を照合するパターンを DO します。
事前にファイル名やパターンがわからない、すべて実行時です。
パターン:
%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