web-dev-qa-db-ja.com

QString分割

これらの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

それらのそれぞれから「neededWord」を抽出したい。それらから見えるように、画像の名前は常に「neededWord」の後にあり、文字列の変更部分は「neededWord」の前にあります。私が考えた方法は、「/」セパレータfrom rightを使用して文字列を分割し、結果のQstringListの2番目の要素を取得することです。では、右から分割する方法、またはそれを行うより良い方法はありますか?

18
Wazery

さて、最後から2番目の要素を使用します。

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

または、正規表現を使用できます。

34
Chris

または私の頭の上からこのようなもの(テストされていない):

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」はneededWord QStringにあるべきです。正規表現パターンは洗練され、よりエレガントな方法で記述できますが、非常に便利な場合でも、それらを記述するのは嫌です!

0
sadjoker

このように修正しました:

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

私は QString::lastIndexOf()QString::mid() と一緒に使用して、不要な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
}

ニーズに応じて、 QStringRef を使用して、これをさらに最適化できます。

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