Ich habe diese URL-Strings
datei: ///home/we/Pictures/neededWord/3193_n.jpg
datei: ///home/smes/Pictures/neededWord/jds_22.png
datei: ///home/seede/kkske/Pictures/neededord/3193_n.jpg
Ich möchte das "requiredWord" von jedem von ihnen extrahieren. Wie es aus ihnen hervorgeht, ist der Name des Bildes immer hinter dem "requiredWord" und der sich ändernde Teil des Strings vor dem "neededWord". Ich habe daran gedacht, den String mit dem "/" - Trenner von rechts zu teilen und das zweite Element in der resultierenden QstringList zu nehmen. Wie kann man also von rechts trennen, oder gibt es einen besseren Weg, das zu tun?
Nun, Sie würden nur das vorletzte Element nehmen:
QStringList pieces = url.split( "/" );
QString neededWord = pieces.value( pieces.length() - 2 );
Alternativ können Sie einen regulären Ausdruck verwenden.
Oder so etwas von oben (nicht getestet):
QString neededWord = "";
QString str = "file:///home/seede/kkske/Pictures/neededWord/3193_n.jpg";
QRegExp rx(".*Pictures\\/(\\w+)\\/.*(?:jpg|png|gif|bmp|tiff)");
rx.setMinimal(false);
rx.setCaseSensitivity(Qt::CaseSensitive) // or use Qt::CaseInsensitive
if (rx.indexIn(str) != -1) {
neededWord = rx.cap(1);
}
"neededWord" sollte in neededWord QString enthalten sein. Regexp-Muster können auf elegante Weise verfeinert und geschrieben werden, aber ich hasse es, diese zu schreiben :) selbst wenn sie sehr nützlich sind!
Ich habe es so repariert:
QStringList splitted = info.url().prettyUrl().split("/"); *header = splitted.at(splitted.findIndex(splitted.last()) - 1);
Ich würde QString::lastIndexOf()
zusammen mit QString::mid()
verwenden, um unnötige Erstellung und Zerstörung von QString/QStringList zu verhindern:
// Example:
// 0 1 2 3 4 5
// 012345678901234567890123456789012345678901234567890
// "file:///home/we/Pictures/neededWord/3193_n.jpg"
QString neededWord;
int const lastSlash = url.lastIndexOf('/'); // := 35
int const prevSlash = url.lastIndexOf('/', -lastSlash - 1); // := 24
if(lastSlash > prevSlash + 1 && prevSlash >= 0) {
neededWord = url.mid(prevSlash, lastSlash - prevSlash - 1); // len := 10
}
Je nach Ihren Anforderungen können Sie dies mit Hilfe von QStringRef noch weiter optimieren:
QStringRef neededWordRef(&url, prevSlash, lastSlash - prevSlash - 1);