首页 > 其他分享 >Qt 正则表达式 QRegularExpression

Qt 正则表达式 QRegularExpression

时间:2024-06-06 11:13:53浏览次数:20  
标签:Qt 正则表达式 QRegularExpression re QRegularExpressionMatch QString captured match

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

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

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

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

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

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

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

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

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

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

 1 //以下的代码为官方提供,放在这里可以参考
 2 //1.通过QRegularExpression 类 match 方法(第二个参数未填,默认提取第一组数据),比较并提取第一组数据
 3 QRegularExpression re("\\d\\d \\w+");
 4 QRegularExpressionMatch match = re.match("abc123 def");
 5 if (match.hasMatch()) {
 6     QString matched = match.captured(0); // matched == "23 def"
 7     // ...
 8 }
 9 
10 //2.通过QRegularExpression 类 match 方法的第二个参数进行数据偏移,比较并提取第N组数据(经测试,该方法不可靠,不过也许是我使用的方式方法不对造成的)
11 QRegularExpression re("\\d\\d \\w+");
12 QRegularExpressionMatch match = re.match("12 abc 45 def", 1);
13 if (match.hasMatch()) {
14     QString matched = match.captured(0); // matched == "45 def"
15     // ...
16 }

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

 1 //以下的代码为官方提供,放在这里可以参考
 2 //1.通过小括号分隔数据,然后通过地址偏移提取这组数据中不同的数据段
 3 QRegularExpression re("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
 4 QRegularExpressionMatch match = re.match("08/12/1985");
 5 if (match.hasMatch()) {
 6     QString day = match.captured(1); // day == "08"
 7     QString month = match.captured(2); // month == "12"
 8     QString year = match.captured(3); // year == "1985"
 9     // ...
10 }
11 
12 //2.通过小括号分隔数据,然后通过 `?<数据段名称>` 来指定每隔数据段的名称,然后通过 QRegularExpressionMatch 类的 captured 方法与数据段段名称直接定位数据段提取数据
13 QRegularExpression re("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$");
14 QRegularExpressionMatch match = re.match("08/12/1985");
15 if (match.hasMatch()) {
16     QString date = match.captured("date"); // date == "08"
17     QString month = match.captured("month"); // month == "12"
18     QString year = match.captured("year"); // year == 1985
19 }

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

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

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

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

 

标签:Qt,正则表达式,QRegularExpression,re,QRegularExpressionMatch,QString,captured,match
From: https://www.cnblogs.com/ybqjymy/p/18234730

相关文章

  • Qt QLineEdit设置IP输入限制
    QT中设置QLineEdit只允许输入IP格式的数据,我们可以使用正则表达式,不过在QT5和QT6中有一点点不一样(QT5中是QRegExp和QRegExpValidator,QT6中是QRegularExpression和QRegularExpressionValidator):QT51#include<QRegExp>2#include<QRegExpValidator>34ui->lineEdit->......
  • windows使用qt-mingw编译opencv4
    windows使用qt-mingw编译opencv4所需软件:cmake-guiqt工具链能正常使用git1.下载opencv源码2.cmake配置opencv2.1选择opencv源码目录和编译目录以opencv4.10为例。​​2.2配置cmake指定qt-mingw工具链点击configure。​​​​​​​​设置CMAKE_MAKE_PROGRAM......
  • PyQt5打造高效的剪贴板管理器
    介绍:在数字化时代,有效地管理剪贴板中的复制内容对于提高生产力和简化使用至关重要。尽管剪贴板是现代计算的基本功能之一,但其默认功能通常缺乏高级管理选项。在本文中,我们将探讨如何利用PyQt5构建强大的剪贴板管理器,PyQt5是用于创建图形用户界面(GUI)的强大Python框架。通过......
  • Qt OPC UA通信
    介绍OPCUA全称OpenPlatformUnifiedArchitecture,开放平台统一架构,是工业自动化领域通用的数据交换协议,它有两套主要的通信机制:1.客户端-服务器通信;2.发布订阅。Qt对OPCUA通信标准也提供了支持,目前还是第三方库的形式(不过Qt官方貌似有文档了),基于open62541开源库进行了封装,使得......
  • Qt6 播放音视频
    一、概述QT6相较于Qt5引入了许多新特性和改进,包括对音视频开发的增强支持。QT6中的音视频支持QT6提供了一套完整的音视频处理功能,这些功能被整合在QtAV项目中。QtAV是一个基于Qt的音视频处理框架,用于处理音视频播放、录制、编解码、处理等任务。QT6对QtAV进行了进一步的集成......
  • 正则表达式学习(3)——语法
    普通字符[abc]匹配中括号的所有字符[^abc]匹配除了中括号的所有字符[A-Z]匹配A-Z的大写字母区间内的字符[a-z]匹配a-z的小写字母区间内的字符[0-9]匹配0-9的数字.匹配除了换行、回车(\n,\r)的单个字符,等价于[^\n\r]\s是匹配所有空白符,包括换行\S非空白符,不包括换......
  • QT笔记:重定向qDebug到控件
    QT笔记:重定向qDebug到控件作为log输出的qDebug可以将调试信息打印到调试终端中,但是有时候实际使用将其输出到UI界面也是很有用的,这里记录下如何将qDebug进行控件重定向。测试版本为QT6.6.2代码mainwindow.h//只要能正常编译过qDebug的就行#include<QMainWindow>QT_BEGIN_......
  • 正则表达式学习(2)---字符特性
    正则表达式特性字符匹配普通字符:匹配字面值。元字符:元字符具有特殊的含义,例如\d匹配任意数字字符,\w匹配任意字母数字字符,.匹配任意字符(除了换行符)等。量词*:匹配前面的模式零次或多次,例如aa*+:匹配前面的模式一次或多次,例如aa+?:匹配前面的模式零次或一次,例如aa?......
  • 正则表达式学习(1)——模式
    正则表达式用于处理字符和字符串,是一种强大的工具1.正则表达式的模式字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。特殊字符:例如点号.、星号*、加号+、问号?等,它们具有特殊的含义和功能。字符类:用方括号[]包围的字符集合,用于匹配方括号内的任......
  • PyQT5之QComboBox
    importos.pathfromPyQt5importQtWidgetsfromPyQt5importQtCore,QtGuiimportsysimportcv2classSpinBoxPanel(QtWidgets.QWidget):def__init__(self,*args,**kwargs):super().__init__(*args,**kwargs)select_btn=QtWidgets.QP......