Dateinamen auf ein Format prüfen und dann splitten
-
Hallo,
ich will Dateinamen auf ein Format prüfen und sie dann in Substrings zerlegen. Das gültige Format schaut wie folgt aus:<Überschrift><ein Leerzeichen><Bindestrich><ein Leerzeichen><Unterüberschrift><Punkt><Dateityp>.Fehler im Format können ausschließlich Leerzeichen an bestimmten Stellen verursachen:
-Wenn der Dateiname mit Leerzeichen beginnt.
-Wenn vor oder nach dem Bindestrich kein oder mehr als ein Leerzeichen vorhanden ist.
-Wenn sich vor dem Punkt Leerzeichen befinden.Meine Funktion zur Prüfung des Formats sieht wie folgt aus:
bool is_valid_format(std::wstring& str) { bool valid = true; wchar_t blank = L' '; if( str[0]==blank ) { std::cout << "invalid format at beginning" << '\n'; valid = false; } unsigned dash = str.find(L'-'); if( str[dash-1]!=blank || str[dash-2]==blank || str[dash+1]!=blank || str[dash+2]==blank ) { std::cout << "invalid format at dash" << '\n'; valid = false; } unsigned dot = str.find(L'.'); if( str[dot-1]==blank ) { std::cout << "invalid format at dot" << '\n'; valid = false; } return valid; }Ist das Format gültig, will ich aus dem Dateinamen die Überschrift, die Unterüberschrift und den Dateityp extrahieren. Das mache ich so:
struct filename { std::wstring title; std::wstring subtitle; std::wstring type; }; filename split_filename(std::wstring& str) { filename file; unsigned dash = str.find(L'-'); unsigned dot = str.find(L'.'); file.title = str.substr(0,dash-1); file.subtitle = str.substr(dash+2,dot-dash-2); file.type = str.substr(dot+1); return file; }Und hier noch ein Anwendungsbeispiel:
int main() { std::wstring str = L"Gebrüder Grimm - Hänsel und Gretel.pdf"; if( is_valid_format(str) ) { filename file = split_filename(str); } return 0; }Nun zu meiner Frage: Ich bin mir nicht sicher, ob meine beiden Funktionen sehr elegant sind, darum wollte ich fragen, wie ihr das machen würdet bzw. ob es einen eleganteren Weg gibt, das zu lösen?
Danke im Voraus.