web-dev-qa-db-de.com

QString-Aufteilung

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?

17
Islam Wazery

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.

32
Chris

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!

0
sadjoker

Ich habe es so repariert:

QStringList splitted = info.url().prettyUrl().split("/");
*header   = splitted.at(splitted.findIndex(splitted.last()) - 1);
0
Islam Wazery

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);
0
Martin Hennings