Одна вещь, которую вы можете использовать, это получить индексы «start» и «end» с помощью indexOf () и просто использовать:
QString x = "start some text here end";
QString s = "start";
QString e = "end"
int start = x.indexOf(s, 0, Qt::CaseInsensitive); // returns the first encounter of the string
int end = x.indexOf(e, Qt::CaseInsensitive); // returns 21
if(start != -1) // we found it
QString y = x.mid(start + s.length(), end);
или midRef, если вы не хотите создавать новый список. Возможно, вам придется обработать «конец», а в противном случае вы можете перейти от 0 к -1, что ничего не даст. Может быть (конец> начало? Конец: начало)
Редактировать: фигу. Если end == -1, это просто означает, что он будет возвращать все до конца (по умолчанию второй параметр равен -1). Если вы не хотите этого, вы можете вместо этого использовать мой пример и использовать какое-то выражение if при выборе «end»
Редактировать: заметил, что я пропустил документ, и это будет def. работа:
#include <QDebug>
int main(int argc, char *argv[]) {
QString x = "start some text here end";
QString s = "start";
QString e = "end";
int start = x.indexOf(s, 0, Qt::CaseInsensitive);
int end = x.indexOf(e, Qt::CaseInsensitive);
if(start != -1){ // we found it
QString y = x.mid(start + s.length(), ((end - (start + s.length())) > -1 ? (end - (start + s.length())) : -1)); // if you dont wanna pass in a number less than -1
or
QString y = x.mid(start + s.length(), (end - (start + s.length()))); // should not be any issues passing in a number less than -1, still works
qDebug() << y << (start + s.length()) << (end - (start + s.length()));
}
}
Создает следующие результаты. Последние два числа - это то, где заканчивается «начало» и начинается «конец».
x = "начать с какого-нибудь текста здесь end" => "с каким-нибудь текстом здесь" 5 16
x = "конец текста" => без надписей
x = "начать тестирование начать текст здесь end" => "начать текст здесь" 13 22 * 1018 *
x = "начать тестирование, начать текст здесь" => "начать текст, здесь" 13 -14
Или вы можете сделать это, используя regEx. Написал для вас очень простой фрагмент:
#include <QDebug>
#include <QRegExp>
int main(int argc, char *argv[]) {
QRegExp rxlen("(start)(.*(?=$|end))");
rxlen.setMinimal(true); // it's lazy which means that if it finds "end" it stops and not trying to find "$" which is the end of the string
int pos = rxlen.indexIn("test start testing some text start here fdsfdsfdsend test ");
if (pos > -1) { // if the string matched, which means that "start" will be in it, followed by a string
qDebug() << rxlen.cap(2); // " testing some text start here fdsfdsfds"
}
}
Это работает, даже если у вас уже есть «конец» в конце, тогда он просто разбирает до конца строки. Наслаждайтесь!