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?
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.
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!
Je l'ai corrigé de cette façon:
QStringList splitted = info.url().prettyUrl().split("/"); *header = splitted.at(splitted.findIndex(splitted.last()) - 1);
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);