web-dev-qa-db-fra.com

Fractionnement QString

J'ai ces ficelles d'url

file: ///home/we/Pictures/neededWord/3193_n.jpg

file: ///home/smes/Pictures/neededWord/jds_22.png

file: ///home/seede/kkske/Pictures/neededWord/3193_n.jpg

Je veux extraire le "neededWord" de chacun d'eux. Comme il apparaît d'eux, le nom de l'image est toujours après le mot "neededWord" et la partie changeante de la chaîne est antérieure à "le mot required". La façon dont je pensais est de scinder la chaîne en utilisant le séparateur "/" de droite et de prendre le deuxième élément de la liste résultante QstringList. Alors, comment se séparer de droite, ou y at-il une meilleure façon de le faire?

17
Islam Wazery

Eh bien, vous ne prendriez que l'avant-dernier élément:

QStringList pieces = url.split( "/" );
QString neededWord = pieces.value( pieces.length() - 2 );

Vous pouvez également utiliser une expression régulière.

32
Chris

Ou quelque chose comme ça du haut de ma tête (non testé):

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" devrait être dans neededWord QString. Le motif Regexp peut être raffiné et écrit de manière plus élégante, mais je déteste écrire ces :) même s'ils sont super utiles!

0
sadjoker

Je l'ai corrigé de cette façon:

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

J'utiliserais QString::lastIndexOf() avec QString::mid() pour éviter la création et la destruction inutiles de QString/QStringList:

// 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
}

En fonction de vos besoins, vous pouvez l’optimiser encore davantage en utilisant un QStringRef :

QStringRef neededWordRef(&url, prevSlash, lastSlash - prevSlash - 1);
0
Martin Hennings