从字母数字 QString 中提取数字

Extract number from Alphanumeric QString

我有一个 "s150 d300" 的 QString。如何从 QString 中获取数字并将其转换为整数。简单地使用 'toInt' 是行不通的。

假设,从"s150 d300"的QString中,只有字母'd'后面的数字是对我有意义。那么如何从字符串中提取 '300' 的值?

非常感谢您的宝贵时间。

一种可能的解决方案是使用正则表达式,如下所示:

#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 将是deprecated, so I propose a solution using 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)

如果您的字符串像您给出的示例一样被拆分为 space 个分隔的标记,您可以通过拆分它来简单地从中获取值,然后找到满足您需要的标记,然后取数字部分它的。在将 qstring 转换成我更喜欢的东西后,我使用了 atoi,但我认为有一种更有效的方法。

虽然这不如正则表达式灵活,但它应该为您提供的示例提供更好的性能。

#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);
}

已经有答案为这个问题提供了合适的解决方案,但我认为强调 QString::toInt 不会起作用也可能会有所帮助,因为要转换的字符串应该是数字的文本表示在给定的例子中,它是一个非标准符号的字母数字表达式,因此有必要按照已经建议的那样手动处理它,以便 Qt 执行转换"understanable"。

如果你能做到,为什么要这么麻烦:

#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"