通俗易懂玩QT:正则表达式 QRegularExpression 学习

正则表达式 QRegularExpression 学习

在 Qt 中有两种和正则相关的类,一种是 QRegExp 类,今天查资料说的好像是从 Qt4 传承下来的,BUG 相对来说比较多,目前基本已停止维护了,多用于正则匹配,还有一种就是今天要讲的 QRegularExpression 类,是 Qt5 新开辟出来的类,相对来说比较完善(网上这样说的,具体有待考证),从 5.0 版本就引入的一个新类(这个在官方文档有说明,已证实),有正则匹配功能,同 QRegularExpressionMatch 类与 QRegularExpressionMatchIterator 类一同使用,具备字符串截取功能(这是今天讲的重点)。

一、判断正则表达是是否有效

isValid() 是 QRegularExpression 类判断正则表达式是否有效的方法

QRegularExpression::isValid() 方法返回值为布尔(bool)类型,true 为表达式有效,false 则为无效,常用方法如下:

cpp 复制代码
//以下的代码为官方提供,放在这里可以参考
QRegularExpression invalidRe("(unmatched|parenthesis");
if (!invalidRe.isValid()) {
    QString errorString = invalidRe.errorString(); // errorString == "missing )"
    int errorOffset = invalidRe.patternErrorOffset(); // errorOffset == 22
    // ...
}

二、正则表达式的匹配比较

QRegularExpression 类的正则匹配需要两个类来配合完成,这两个类就是之前提到的 QRegularExpressionMatch 类与 QRegularExpressionMatchIterator 类,前者提供单一匹配机制,一般多用于比较与单一数据提取,后者提供多重匹配机制,一般多用于多重数据提取

1)QRegularExpression 类与 QRegularExpressionMatch 类搭配使用,提供单一匹配比较,使用方法如下:

cpp 复制代码
//以下的代码为官方提供,放在这里可以参考
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("abc123 def");
bool hasMatch = match.hasMatch(); // true

2)QRegularExpression 类与 QRegularExpressionMatch 类搭配使用,提供单一匹配比较与数据提取(多组数据时,可指定数据组数),使用方法如下:

cpp 复制代码
//以下的代码为官方提供,放在这里可以参考
//1.通过QRegularExpression 类 match 方法(第二个参数未填,默认提取第一组数据),比较并提取第一组数据
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("abc123 def");
if (match.hasMatch()) {
    QString matched = match.captured(0); // matched == "23 def"
    // ...
}

//2.通过QRegularExpression 类 match 方法的第二个参数进行数据偏移,比较并提取第N组数据(经测试,该方法不可靠,不过也许是我使用的方式方法不对造成的)
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("12 abc 45 def", 1);
if (match.hasMatch()) {
    QString matched = match.captured(0); // matched == "45 def"
    // ...
}

3)QRegularExpression 类与 QRegularExpressionMatch 类搭配使用,提供单一匹配比较与数据提取的同时,也提供了数据分段提取方法,使用方式如下:

cpp 复制代码
//以下的代码为官方提供,放在这里可以参考
//1.通过小括号分隔数据,然后通过地址偏移提取这组数据中不同的数据段
QRegularExpression re("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
QRegularExpressionMatch match = re.match("08/12/1985");
if (match.hasMatch()) {
    QString day = match.captured(1); // day == "08"
    QString month = match.captured(2); // month == "12"
    QString year = match.captured(3); // year == "1985"
    // ...
}

//2.通过小括号分隔数据,然后通过 `?<数据段名称>` 来指定每隔数据段的名称,然后通过 QRegularExpressionMatch 类的 captured 方法与数据段段名称直接定位数据段提取数据
QRegularExpression re("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$");
QRegularExpressionMatch match = re.match("08/12/1985");
if (match.hasMatch()) {
    QString date = match.captured("date"); // date == "08"
    QString month = match.captured("month"); // month == "12"
    QString year = match.captured("year"); // year == 1985
}

4)QRegularExpression 类与 QRegularExpressionMatch 类搭配使用,提供单一匹配比较与数据提取的同时,还提供了每组数据的起始位置与结束位置,使用方式如下:

cpp 复制代码
//以下的代码为官方提供,放在这里可以参考
QRegularExpression re("abc(\\d+)def");
QRegularExpressionMatch match = re.match("XYZabc123defXYZ");
if (match.hasMatch()) {
    int startOffset = match.capturedStart(1); // startOffset == 6
    int endOffset = match.capturedEnd(1); // endOffset == 9
    // ...
}

5)QRegularExpression 类与 QRegularExpressionMatchIterator 类搭配使用,提供多重匹配比较与数据提取,使用方法如下:

cpp 复制代码
//以下的代码为官方提供,放在这里可以参考
QRegularExpression re("(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch("the quick fox");
QStringList words;
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    QString word = match.captured(1);
    words << word;
}
// words contains "the", "quick", "fox"

学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!

相关推荐
海绵波波10731 分钟前
Qt操作主/从视图及XML——实例:汽车管理系统
xml·qt·汽车
Fairy_sevenseven1 小时前
【二十八】【QT开发应用】模拟WPS Tab
开发语言·qt·wps
Death2001 小时前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
niu_sama1 小时前
基于muduo库函数实现protobuf协议的通信
开发语言·qt
不写八个1 小时前
Qt教程(001):Qt概述与安装
开发语言·qt
Death2002 小时前
Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系
c语言·c++·qt·3d·c#
一律清风12 小时前
QT-文件创建时间修改器
c++·qt
不知所云,12 小时前
qt cmake自定义资源目录,手动加载资源(图片, qss文件)
开发语言·qt
Death20013 小时前
Qt 6 相比 Qt 5 的主要提升与更新
开发语言·c++·qt·交互·数据可视化
机器视觉知识推荐、就业指导13 小时前
使用Qt实现实时数据动态绘制的折线图示例
开发语言·qt