通俗易懂玩QT:正则表达式 QRegularExpression 学习
创始人
2024-12-29 00:07:26
0

正则表达式 QRegularExpression 学习

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

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

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

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

//以下的代码为官方提供,放在这里可以参考 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 类搭配使用,提供单一匹配比较,使用方法如下:

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

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

//以下的代码为官方提供,放在这里可以参考 //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 类搭配使用,提供单一匹配比较与数据提取的同时,也提供了数据分段提取方法,使用方式如下:

//以下的代码为官方提供,放在这里可以参考 //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("^(?\\d\\d)/(?\\d\\d)/(?\\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 类搭配使用,提供单一匹配比较与数据提取的同时,还提供了每组数据的起始位置与结束位置,使用方式如下:

//以下的代码为官方提供,放在这里可以参考 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 类搭配使用,提供多重匹配比较与数据提取,使用方法如下:

//以下的代码为官方提供,放在这里可以参考 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" 

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

相关内容

热门资讯

第九分钟辅助!天天爱柳州辅助器... 天天爱柳州辅助器是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用户可以加我微...
热门推荐!微信小程序蜀山辅助器... 热门推荐!微信小程序蜀山辅助器免费下载(辅助)外挂辅助开挂插件(有挂秘诀)-哔哩哔哩;最新版2026...
第4分钟普及!奇迹陕西辅助器(... 第4分钟普及!奇迹陕西辅助器(透视)原来真的是有挂脚本(推荐开挂软件);奇迹陕西辅助器免费下载原版,...
第八分钟讲解!越乡游金花辅助,... 第八分钟讲解!越乡游金花辅助,九酷众游辅助,细节方法(有挂实锤)-哔哩哔哩1、下载安装好越乡游金花辅...
透视软件!浙江宝宝游戏辅助工具... 透视软件!浙江宝宝游戏辅助工具(辅助)外挂开挂辅助插件(了解有挂)-哔哩哔哩;是一款可以让一直输的玩...
第5分钟发现!桃乐甘肃麻将下载... 《第5分钟发现!桃乐甘肃麻将下载辅助器(辅助)原来有挂软件(必看开挂工具)》 桃乐甘肃麻将下载辅助器...
第8分钟了解!河洛刚次辅助,温... 第8分钟了解!河洛刚次辅助,温州茶苑辅助软件,详细教程(有挂攻略)-哔哩哔哩;无需打开直接搜索加薇1...
热点讨论!新二号辅助软件下载(... 热点讨论!新二号辅助软件下载(辅助)外挂辅助开挂软件(有挂教程)-哔哩哔哩;是一款可以让一直输的玩家...
8分钟解说!网易亲友圈辅助(开... 8分钟解说!网易亲友圈辅助(开挂)原来有挂平台(必看开挂安装);小薇(透视辅助)致您一封信;亲爱网易...
第5分钟开挂!如何在哈灵上辅助... 第5分钟开挂!如何在哈灵上辅助,决战卡五星辅助看牌器,解说技巧(有挂方略)-哔哩哔哩 了解更多开挂安...