从字母数字 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"
我有一个 "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"