Pattern Matching und Platzhalter Werte
-
05-07-2019 - |
Frage
Ich schreibe eine Anwendung, die Regeln verwenden Umbenennen eine Liste von Dateien, die vom Benutzer auf der Basis von Informationen zu benennen. Die Dateien werden inkonsistent beginnen benannt, oder die Dateinamen können konsistent sein. Der Benutzer wählt eine Liste von Dateien und gibt Informationen über die Dateien (für MP3s, würden sie Künstler, Titel, Album, etc. sein). Mit Hilfe eines Umbenennungsregel (Beispiel unten), verwendet das Programm den Benutzer eingegebenen Informationen, die Dateien entsprechend umbenannt werden.
Wenn jedoch alle oder einige der Dateien konsequent benannt sind, würde Ich mag, damit das Programm die Dateiinformationen zu ‚erraten‘. Das ist das Problem, das ich habe. Was ist der beste Weg, dies zu tun?
Beispiel Dateinamen:
Kraftwerk-Kraftwerk-01-RuckZuck.mp3
Kraftwerk-Autobahn-01-Autobahn.mp3
Kraftwerk-Computer World-03-Numbers.mp3
Umbenennen Regel:
%Artist%-%Album%-%Track%-%Title%.mp3
Das Programm soll den Künstler, Titelnummer, Titel und Albumnamen richtig geschlossen werden.
Auch was ist der beste Weg, dies zu tun? Ich dachte, reguläre Ausdrücke, aber ich bin ein wenig verwirrt.
Lösung
Am einfachsten wäre jedes %Label%
mit (?<Label>.*?)
zu ersetzen, und die Flucht alle anderen Zeichen.
%Artist%-%Album%-%Track%-%Title%.mp3
wird
(?<Artist>.*?)-(?<Album>.*?)-(?<Track>.*?)-(?<Title>.*?)\.mp3
Sie würden dann jede Komponente in benannte Capture-Gruppen erhalten.
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;
}
Aber wenn der Benutzer verlässt die Trennzeichen aus, oder wenn die Begrenzungszeichen in den Bereichen enthalten sein könnten, könnten Sie einige seltsame Ergebnisse. Das Muster würde für %Artist%%Album%
würde (?<Artist>.*?)(?<Album>.*?)
, die sich auf .*?.*?
entspricht. Das Muster würde nicht wissen, wo zu spalten.
Dies könnte gelöst werden, wenn Sie das Format bestimmter Felder, wie die Spur-Nummer kennen. Wenn Sie %Track%
übersetzen stattdessen (?<Track>\d+)
, würde wissen, das Muster, dass alle Ziffern im Dateinamen muss die Track
sein.
Andere Tipps
Nicht die Antwort auf die Frage, die Sie gefragt, sondern ein ID3-Tag Bibliothek zu lesen sein könnte ein besserer Weg, dies zu tun, wenn Sie MP3-Dateien verwenden. Eine schnelle Google kam mit:. C # ID3-Bibliothek
Wie, für die Zeichenfolge Positionen halten den Künstler, das Album zu erraten, und Songtitel ... das erste, was ich denken kann, ist, dass, wenn Sie eine gute Auswahl haben, mit zu arbeiten, sagen mehrere Alben, könnte man zuerst sehen, welche Position wiederholt die meisten, die der Künstler sein würde, der die zweitmeisten (Album) wiederholt und die am wenigsten (Songtitel) wiederholt.
Ansonsten scheint es wie eine schwierige Vermutung nur auf ein paar Strings in dem Dateinamen basiert machen ... könnten Sie den Benutzer auch Eingang einen passender Ausdruck für die Dateinamen stellen, die die Reihenfolge der Felder beschreiben / p>
Die Dateinamen in Ihrem Beispiel scheinen mir ziemlich konsistent. Sie können einfach String.split tun () und jedes Element des resultierenden Arrays auf dessen nach Tag-Informationen hinzuzufügen.
Erraten, an welcher Stelle ist die Tag-Informationen TONNEN Heuristiken beinhalten würde.
Btw. Ordner, die Song-Dateien haben in der Regel einige Muster in ihrem Namen als auch, f.e.
enthalten1998 - Sieben
1999 - Periscope
2000 - CO2
Das Format ist hier% Jahr% -.% Albumname%, das könnten Ihnen helfen, in den Dateinamen zu identifizieren, welches Element ist das Album
Um zu klären, I ein Muster für die Dateinamen übereinstimmen gegen.
Ich weiß nicht, die Dateinamen oder Muster vor der Zeit, es ist alles in Laufzeit.
Muster:
%Artist%-%Album%-%Track%-%Title%.mp3
Dateiname:
Kraftwerk-Kraftwerk-01-RuckZuck.mp3 Kraftwerk-Autobahn-01-Autobahn.mp3 Kraftwerk-Computer World-03-Numbers.mp3
Erwartetes Ergebnis:
Artist Album Track Title Kraftwerk Kraftwerk 01 RuckZuck Kraftwerk Autobahn 01 Autobahn Kraftwerk Computer World 01 Numbers
Auch das Format und Dateinamen sind nicht immer gleich.
Ich habe eine Kommandozeilen-File Renamer geschrieben --- RenameWand ---, die die Art tut von Musterabgleich Sie beschreiben. Es ist in Java zwar, aber ich denke, einen Teil des Quellcodes und die Verwendung Dokumentation für Sie von Interesse sein kann. Ein einfaches Beispiel dafür, was das Programm tun können:
Quell-Pattern (vom Benutzer angegeben):
<artist>-<album>-<track>-<title>.mp3
Zielmuster (vom Benutzer angegeben):
<title.upper>-<3|track+10>-<album.lower>-<artist>.mp3
Original Dateiname:
Kraftwerk-Computer World-03-Numbers.mp3
Umbenannt Dateiname:
NUMBERS-013-computer world-Kraftwerk.mp3