Разделение QString

У меня есть эти строки URL

файл:///home/we/Pictures/neededWord/3193_n.jpg

файл:///home/smes/Pictures/neededWord/jds_22.png

файл:///home/seede/kkske/Pictures/neededWord/3193_n.jpg

Я хочу извлечь «нужное слово» из каждого из них. Как видно из них, имя изображения всегда стоит после "neededWord", а изменяющаяся часть строки - перед "neededWord". Я подумал о том, чтобы разбить строку с помощью разделителя "/" справа и взять второй элемент в полученном QstringList. Итак, как разделить справа, или есть лучший способ сделать это?


person Wazery    schedule 01.08.2012    source источник


Ответы (4)


Ну, вы бы просто взяли предпоследний элемент:

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

В качестве альтернативы вы можете использовать регулярное выражение.

person Chris    schedule 01.08.2012

Я исправил это так:

QStringList splitted = info.url().prettyUrl().split("/");
*header   = splitted.at(splitted.findIndex(splitted.last()) - 1);
person Wazery    schedule 01.08.2012
comment
Почему вам нужно искать последний элемент? Вы знаете, что его индекс уже такой же, как вы знаете, что первый элемент имеет индекс 0. Это очень странный способ сделать что-то настолько простое. - person Chris; 01.08.2012

Я бы использовал 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);
person Martin Hennings    schedule 30.05.2018

Или что-то вроде этого из головы (не проверено):

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" должен быть в QString needWord. Шаблон регулярных выражений можно улучшить и написать более элегантно, но я ненавижу их писать :), даже если они очень полезны!

person sadjoker    schedule 02.08.2012
comment
Он пытается захватить текст, который находится на месте needWord, а не фактическое название изображения. - person Chris; 03.08.2012
comment
Упс, тогда мой косяк :) исправил. Я должен читать внимательнее! Спасибо. - person sadjoker; 04.08.2012