Извлечь номер из буквенно-цифровой QString

У меня есть QString «s150 d300». Как я могу получить числа из QString и преобразовать их в целое число. Простое использование toInt не работает.

Допустим, из QString «s150 d300», только число после алфавита ‘d’ имеет значение для меня. Так как я могу извлечь значение ‘300’ из строки?

Большое спасибо за уделенное время.

2

Решение

Одним из возможных решений является использование регулярных выражений, как показано ниже:

#include <QCoreApplication>

#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QString str = "s150 dd300s150 d301d302s15";

QRegExp rx("d(\\d+)");

QList<int> list;
int pos = 0;

while ((pos = rx.indexIn(str, pos)) != -1) {
list << rx.cap(1).toInt();
pos += rx.matchedLength();
}
qDebug()<<list;

return a.exec();
}

Выход:

(300, 301, 302)

Благодаря комментарию @IlBeldus и по информации QRegExp будет осуждается, поэтому я предлагаю решение с использованием QRegularExpression:

Другое решение:

QString str = "s150 dd300s150 d301d302s15";

QRegularExpression rx("d(\\d+)");

QList<int> list;
QRegularExpressionMatchIterator i = rx.globalMatch(str);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
QString word = match.captured(1);
list << word.toInt();
}

qDebug()<<list;

Выход:

(300, 301, 302)
3

Другие решения

Если ваша строка разбита на разделенные пробелами токены, как в приведенном вами примере, вы можете просто извлечь из нее значение, разделив его, затем найти токен, который соответствует вашим потребностям, и затем взять числовую часть. Я использовал atoi после преобразования qstring в то, что мне удобнее, но я думаю, что есть более эффективный способ.

Хотя это не так гибко, как регулярные выражения, оно должно повысить производительность для предоставленного вами примера.

#include <QCoreApplication>

int main() {
QString str = "s150 d300";

// foreach " " space separated token in the string
for (QString token : str.split(" "))
// starts with d and has number
if (token[0] == 'd' && token.length() > 1)
// print the number part of it
qDebug() <<atoi(token.toStdString().c_str() + 1);
}
2

Почему все проблемы, если вы можете просто сделать:

#include <QDebug>
#include <QString>

const auto serialNumberStr = QStringLiteral("s150 d300");

int main()
{
const QRegExp rx(QLatin1Literal("[^0-9]+"));
const auto&& parts = serialNumberStr.split(rx, QString::SkipEmptyParts);

qDebug() << "2nd nbr:" << parts[1];
}

Распечатывает: 2nd nbr: "300"

1

Уже есть ответы, дающие подходящее решение этой проблемы, но я думаю, что было бы также полезно подчеркнуть, что QString::toInt не будет работать, потому что преобразуемая строка должна быть текстовым представлением числа, а в данном примере это буквенно-цифровое выражение в нестандартной записи, поэтому необходимо вручную обработать ее, как уже было предложено, чтобы сделайте это «понятным» для Qt, чтобы выполнить преобразование.

0