Qt 用QRegExp从字符串中提取车牌号码

使用QRegExp匹配车牌号
本文介绍了一个使用C++ Qt库中的QRegExp类来匹配中国车牌号的例子。通过定义正则表达式规则并利用QRegExp的方法,从字符串中准确地提取出了车牌号信息。

main.cpp

#include <QCoreApplication>
#include <QRegExp>
#include <QString>
#include <QDebug>
#include <QStringList>
#include <QTextCodec>

void testRegexCapture();

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

    testRegexCapture();
    return a.exec();
}


void testRegexCapture()
{
    QString plateNumber;
    plateNumber = "1111京A75301aaaa";


    // 截取车牌号码
    plateNumber = plateNumber.simplified();
    QRegExp rx("[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}");
    int pos = rx.indexIn(plateNumber);
    qDebug() <<  rx.capturedTexts();
}

输出结果:



<think>我们被要求从字符串提取数字,参考了多个引用,提供了几种方法。用户的需求是使用Qt字符串提取数字。 根据引用,我们可以总结以下几种方法: 1. 使用QRegExp正则表达式(引用1、3、4) 2. 使用循环遍历字符串,逐个字符判断(引用2) 3. 使用sscanf(引用1,但注意sscanf是C函数,需要将QString转换为char*) 我们将分别介绍这些方法,并给示例代码。 注意:引用中有些方法使用了QRegExp,但需要注意的是,Qt 5.0以后推荐使用QRegularExpression,但QRegExp仍然可用。不过为了与引用一致,我们先使用QRegExp,同时也会提到QRegularExpression。 步骤: 1. 方法一:使用QRegExp提取所有数字(匹配连续的数字) 2. 方法二:遍历字符串提取数字字符 3. 方法三:使用sscanf(适用于字符串开头就是数字的情况) 另外,我们还可以使用QString的方法,例如使用split等,但这引用中没有提到,我们可以根据需求补充。 但是,用户的需求可能包括提取字符串中的所有数字(可能有多组数字),或者只提取第一组连续数字。我们将分别说明。 根据引用1,方法一可以提取第一组连续数字(注意,它在一个循环中,但只取了最后一次匹配,实际上应该取第一次或全部,这我们调整一下)。 下面我们详细说明。</think>在Qt中从字符串提取数字,以下是几种常用方法及代码示例: ### 一、正则表达式法(推荐) ```cpp // 提取字符串中所有连续数字(返回第一个匹配项) QString str = "Item123Price45"; QRegExp rx("(\\d+)"); // 匹配连续数字 if (rx.indexIn(str) != -1) { int num = rx.cap(1).toInt(); // 123 } // 提取所有数字(多组匹配) QStringList numList; int pos = 0; while ((pos = rx.indexIn(str, pos)) != -1) { numList << rx.cap(1); pos += rx.matchedLength(); } // numList: ["123", "45"] ``` **特点**: - 使用`QRegExp("\\d+")`匹配连续数字 - `cap(1)`获取捕获组内容 - 适合复杂字符串模式匹配[^1][^3][^4] --- ### 二、字符遍历法 ```cpp QString str = "A7B12C"; QString digits; for (int i = 0; i < str.length(); ++i) { if (str[i].isDigit()) digits.append(str[i]); } // digits = "712" ``` **特点**: - 使用`QChar::isDigit()`判断数字字符 - 简单高效,适合基础需求[^2] --- ### 三、sscanf函数法 ```cpp QString str = "99%"; char buf[32]; sscanf(str.toLatin1().data(), "%[0-9]", buf); // 提取头部连续数字 int num = atoi(buf); // 99 ``` **特点**: - 利用C标准库的格式化输入 - 仅适合数字在字符串开头的情况[^1] --- ### 四、QRegularExpression(Qt5+推荐) ```cpp // 现代正则API(Qt5.0+) QString str = "Version5.2.1"; QRegularExpression re("\\d+"); QRegularExpressionMatchIterator it = re.globalMatch(str); while (it.hasNext()) { QRegularExpressionMatch match = it.next(); qDebug() << match.captured(0); // 输"5", "2", "1" } ``` ### 选择建议 | 方法 | 适用场景 | |--------------------|----------------------------------| | 正则表达式 | 需提取多组数字/复杂文本模式 | | 字符遍历 | 简单提取所有数字字符 | | sscanf | 数字在字符串开头且格式已知 | | QRegularExpression | Qt5+项目,需更强大的正则功能 | > 注意:若需提取特定位置数字(如最后两位),可在遍历或正则匹配后使用`mid()`截取[^2]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值