从字母数字QString中提取数字

时间:2017-07-26 04:38:53

标签: c++ qt integer qt5 alphanumeric

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

比方说,从“s150 d300”的QString开始,只有字母“d”后的数字才对我有意义。那么如何从字符串中提取'300'的值?

非常感谢你的时间。

4 个答案:

答案 0 :(得分:3)

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

#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,所以我提出了使用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)

答案 1 :(得分:2)

如果您的字符串被拆分为空格分隔的标记,就像您给出的示例一样,您可以通过拆分它来获取值,然后找到满足您需求的标记,然后取出它的数字部分。在将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);
}

答案 2 :(得分:1)

为什么所有麻烦都可以解决:

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

答案 3 :(得分:0)

已经有答案为这个问题提供了合适的解决方案,但我认为强调QString::toInt不起作用也是有帮助的,因为被转换的字符串应该是数字的文本表示形式给定的例子它是非标准表示法中的字母数字表达式,因此有必要按照已经建议的方式手动处理它,以使Qt执行转换成为“不可判断的”。