Qt正则表达式QRegularExpression

news2025/4/1 2:36:27

在 Qt 中,正则表达式是处理文本的强大工具,它能够帮助我们匹配、搜索和替换特定的字符串模式。自 Qt 5 起,QRegularExpression 类提供了对 ECMAScript 标准的正则表达式支持,这使得它在处理各种复杂的字符串任务时变得更加高效和灵活。本文将详细讲解如何在 Qt 中使用 QRegularExpression 类,以及常见的正则表达式模式的实际应用。

1. 什么是正则表达式?

正则表达式(Regular Expression,简称正则)是一个特殊的文本字符串,它描述了搜索文本的模式。我们可以通过正则表达式定义匹配规则,进而用于文本搜索、替换、验证和分组提取数据。正则表达式广泛应用于数据验证、文本解析等场景。

2. QRegularExpression 类概述

在 Qt 中,QRegularExpression 类用来处理正则表达式。相比于旧版的 QRegExp 类,QRegularExpression 提供了更现代、更强大的功能,特别是支持 ECMAScript 标准,使得它能够处理更复杂的正则表达式。

2.1 QRegularExpression 的基本构造与用法

QRegularExpression 类的主要构造函数是:

QRegularExpression::QRegularExpression(const QString &pattern)

它接收一个字符串作为正则表达式的模式。我们可以使用此模式对文本进行匹配、验证或者替换操作。

2.2 匹配和提取

使用 QRegularExpression,我们通常会进行以下操作:

  • match():用来检查字符串是否符合正则表达式模式。

  • captured(int group = 0):提取匹配的内容,group 表示捕获组的编号。

3. 常见正则表达式模式讲解与示例

下面通过几个常见的正则表达式实例,详细讲解每个正则表达式的功能以及如何在 Qt 中使用 QRegularExpression 进行操作。

3.1 基本模式
  1. .:匹配任意字符(除了换行符)。

  2. \d:匹配一个数字字符(等价于 [0-9])。

  3. \w:匹配一个字母、数字或下划线字符(等价于 [A-Za-z0-9_])。

  4. \s:匹配任意空白字符。

  5. +:匹配前一个元素一次或多次。

  6. *:匹配前一个元素零次或多次。

  7. ?:匹配前一个元素零次或一次。

  8. ^:匹配字符串的开始。

  9. $:匹配字符串的结束。

  10. ():分组,用于捕获匹配的子字符串。

  11. []:字符集,匹配包含在其中的任何一个字符。

3.2 匹配电子邮件地址

假设我们需要验证一个电子邮件地址是否符合常见的格式,可以使用以下正则表达式:

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
示例代码:
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QDebug>

int main() {
    // 创建正则表达式,用于匹配电子邮件地址
    QRegularExpression re(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})");
    
    // 测试电子邮件字符串
    QString email = "user@example.com";
    
    // 使用正则表达式进行匹配
    QRegularExpressionMatch match = re.match(email);
    
    // 检查是否匹配成功
    if (match.hasMatch()) {
        qDebug() << "有效的电子邮件地址!";
    } else {
        qDebug() << "无效的电子邮件地址!";
    }

    return0;
}
解析:
  • [a-zA-Z0-9._%+-]+:匹配电子邮件用户名部分,允许字母、数字以及常见的特殊符号。

  • @:用于分隔用户名和域名。

  • [a-zA-Z0-9.-]+:匹配域名部分,支持字母、数字、点(.)和连字符(-)。

  • \.:匹配字面上的点(.),用于分隔域名和顶级域。

  • [a-zA-Z]{2,}:匹配顶级域,至少有两个字母(如 .com.org 等)。

3.3 匹配电话号码格式(如 (123) 456-7890

我们可以使用正则表达式来验证电话号码格式:

\(\d{3}\) \d{3}-\d{4}
示例代码:
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QDebug>

int main() {
    // 创建正则表达式,匹配格式 (xxx) xxx-xxxx
    QRegularExpression re(R"(\(\d{3}\) \d{3}-\d{4})");
    
    // 测试电话号码
    QString phone = "(123) 456-7890";
    
    // 使用正则表达式进行匹配
    QRegularExpressionMatch match = re.match(phone);
    
    // 检查是否匹配成功
    if (match.hasMatch()) {
        qDebug() << "有效的电话号码!";
    } else {
        qDebug() << "无效的电话号码!";
    }

    return0;
}
解析:
  • \(:匹配字面上的左括号,需要转义。

  • \d{3}:匹配 3 个数字,表示区号。

  • \):匹配字面上的右括号,同样需要转义。

  • 空格:匹配字面上的空格字符。

  • \d{3}:匹配 3 个数字,表示电话号码的中间部分。

  • -:匹配字面上的连字符。

  • \d{4}:匹配 4 个数字,表示电话号码的后四位。

3.4 匹配日期格式(如 2025-02-11

如果我们想匹配格式为 YYYY-MM-DD 的日期,可以使用如下正则表达式:

(\d{4})-(\d{2})-(\d{2})
示例代码:
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QDebug>

int main() {
    // 创建正则表达式,匹配日期格式 YYYY-MM-DD
    QRegularExpression re(R"((\d{4})-(\d{2})-(\d{2}))");
    
    // 测试日期字符串
    QString date = "2025-02-11";
    
    // 使用正则表达式进行匹配
    QRegularExpressionMatch match = re.match(date);
    
    // 检查是否匹配成功
    if (match.hasMatch()) {
        qDebug() << "年份:" << match.captured(1);
        qDebug() << "月份:" << match.captured(2);
        qDebug() << "日期:" << match.captured(3);
    } else {
        qDebug() << "无效的日期格式!";
    }

    return0;
}
解析:
  • (\d{4}):匹配 4 个数字,表示年份。

  • -:匹配字面上的连接符 -

  • (\d{2}):匹配 2 个数字,表示月份。

  • -:匹配字面上的连接符 -

  • (\d{2}):匹配 2 个数字,表示日期。

3.5 匹配单词长度为 5 的单词

为了匹配长度为 5 的单词,可以使用如下的正则表达式:

\b\w{5}\b
示例代码:
#include <QRegularExpression>
#include <QDebug>

int main() {
    // 创建正则表达式,匹配长度为 5 的单词
    QRegularExpression re(R"(\b\w{5}\b)");
    
    // 测试字符串
    QString text = "The quick brown fox jumps over the lazy dog.";
    
    // 使用正则表达式进行匹配
    QRegularExpressionMatchIterator iterator = re.globalMatch(text);
    
    // 输出匹配到的所有长度为 5 的单词
    while (iterator.hasNext()) {
        QRegularExpressionMatch match = iterator.next();
        qDebug() << match.captured(0);  // 输出匹配到的单词
    }

    return0;
}
解析:
  • \b:单词边界,确保匹配的是独立的单词。

  • \w:匹配字母、数字或下划线字符。

  • {5}:表示匹配单词长度为 5。

  • \b:单词边界,确保匹配的结束是单词的结尾。

4. 总结

在 Qt 中,QRegularExpression 提供了一个强大的正则表达式引擎,支持 ECMAScript 标准,并且能够高效地处理复杂的文本匹配任务。通过本文中的代码示例,你可以了解如何使用正则表达式来匹配和验证电子邮件地址、电话号码、日期、单词等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运筹说 第134期 | 矩阵对策的解法

上一期我们了解了矩阵对策的基本理论&#xff0c;包含矩阵对策的纯策略、矩阵对策的混合策略和矩阵对策的基本定理。 接下来小编将为大家介绍矩阵对策的解法&#xff0c;包括图解法、方程组法和线性规划法三种经典方法。 01 图解法 本节首先介绍矩阵对策的图解法&#xff0c;…

3. 轴指令(omron 机器自动化控制器)——>MC_CamOut

机器自动化控制器——第三章 轴指令 15 MC_CamOut变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶指令的中止▶重启运动指令▶多重启动运动指令▶异常 MC_CamOut 结束通过输入参数指定的轴的凸轮动作 指令名称FB/FUN图形表现ST表现MC_CamOut解除凸轮动作FBMC_Cam…

TF32 与 FP32 的区别

TF32&#xff08;Tensor Float 32&#xff09;与FP32&#xff08;单精度浮点数&#xff09;是两种用于深度学习和高性能计算的浮点格式&#xff0c;其核心区别体现在精度、性能优化和应用场景上。以下是两者的详细对比分析&#xff1a; 一、位宽与结构差异 FP32的位宽结构 FP32…

【大模型】视觉语言模型:Qwen2.5-VL的使用

官方github地址&#xff1a;https://github.com/QwenLM/Qwen2.5-VL 目录 Qwen家族的最新成员&#xff1a;Qwen2.5-VL 主要增强功能 模型架构更新 快速开始 使用Transformers聊天 Docker Qwen家族的最新成员&#xff1a;Qwen2.5-VL 主要增强功能 强大的文档解析功能&am…

测试用例与需求脱节的修复方案

测试用例与需求脱节的问题可通过明确需求定义、加强需求追踪、建立有效沟通机制进行修复。其中&#xff0c;加强需求追踪尤为关键&#xff0c;能确保测试用例与实际需求的精确匹配&#xff0c;避免资源浪费和测试效果不佳。据行业研究&#xff0c;约70%的软件缺陷源于需求管理不…

【Unity】 鼠标拖动物体移动速度跟不上鼠标,会掉落

错误示范&#xff1a; 一开始把移动的代码写到update里去了&#xff0c;发现物体老是掉(总之移动非常不流畅&#xff0c;体验感很差&#xff09; void Update(){Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out RaycastHit hit, M…

VLAN 高级特性

VLAN Access 类型端口&#xff1a;只能属于 1 个 VLAN&#xff0c;发出数据时只能根据 PVID 剥离一个 VLAN Tag 入方向&#xff1a;针对没有 tag 的数据包打上 PVID 的 tag出方向&#xff1a;将 tag 为本接口 PVID 的数据包去掉 tag&#xff0c;发出数据。&#xff08;只有在与…

学习中学习的小tips(主要是学习苍穹外卖的一些学习)

目录 架构的细分 使用实体类来接收配置文件中的值 webMvcConfig类&#xff1a; jwt令牌 管理端的拦截器&#xff1a; JwtProperties&#xff1a; JwtTokenAdminInterceptor &#xff1a; 对密码加密操作 Redis&#xff1a; 分页查询 整体思想 为什么动态 SQL 推荐传实体…

【极速版 -- 大模型入门到进阶】LORA:大模型轻量级微调

文章目录 &#x1f30a; 有没有低成本的方法微调大模型&#xff1f;&#x1f30a; LoRA 的核心思想&#x1f30a; LoRA 的初始化和 r r r 的值设定&#x1f30a; LoRA 实战&#xff1a;LoraConfig参数详解 论文指路&#xff1a;LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE M…

线程同步——读写锁

Linux——线程同步 读写锁 目录 一、基本概念 1.1 读写锁的基本概念 1.2 读写锁的优点 1.3 读写锁的实现 1.4 代码实现 一、基本概念 线程同步中的读写锁&#xff08;Read-Write Lock&#xff09;&#xff0c;也常被称为共享-独占锁&#xff08;Shared-Exclusive Lock&a…

邪性!Anaconda安装避坑细节Windows11

#工作记录 最近不断重置系统和重装Anaconda&#xff0c;配置的要累死&#xff0c;经几十次意料之外的配置状况打击之后&#xff0c;最后发现是要在在Anaconda安装时&#xff0c;一定要选“仅为我安装”这个选项&#xff0c;而不要选“为所有用户安装”这个选项。 选“仅为我安…

【大模型】激活函数之SwiGLU详解

文章目录 1. Swish基本定义主要特点代码实现 2. GLU (Gated Linear Unit)基本定义主要特点代码实现 3. SwiGLU基本定义主要特点代码实现 参考资料 SWiGLU是大模型常用的激活函数&#xff0c;是2020年谷歌提出的激活函数&#xff0c;它结合了Swish和GLU两者的特点。SwiGLU激活函…

AOA与TOA混合定位,MATLAB例程,三维空间下的运动轨迹,滤波使用EKF,附下载链接

本文介绍一个MATLAB代码&#xff0c;实现基于 到达角&#xff08;AOA&#xff09; 和 到达时间&#xff08;TOA&#xff09; 的混合定位算法&#xff0c;结合 扩展卡尔曼滤波&#xff08;EKF&#xff09; 对三维运动目标的轨迹进行滤波优化。代码通过模拟动态目标与基站网络&am…

【211】线上教学系统

--基于SSM线上教学平添 主要实现的功能有&#xff1a; 管理员 : 首页、个人中心、学员管理、资料类型管理、学习资料管理、交流论坛、我的收藏管理、试卷管理、留言板管理、试题管理、系统管理、考试管理。 学员 : 首页、个人中心、我的收藏管理、留言板管理、考试管理。 前台…

从混乱思绪到清晰表达:记录想法如何改变你的学习人生

关键要点 • 记录想法似乎是发现自己想法并将其组织成可传播形式的最佳理由&#xff0c;研究表明写作和教学能增强学习和理解。 • 证据倾向于支持写作有助于澄清思想&#xff0c;而教学通过“教授效应”深化知识。 • 教学和分享被认为是最有效的学习方法&#xff0c;这与记录…

电机控制常见面试问题(二十)

文章目录 一.整流电路绕组接法二.电机为什么需要转速器三.电机转矩产生原理四.电机控制中载波频率大小的确定五.开关周期 Tpwm 一.整流电路绕组接法 为了引出直流的输出&#xff0c;一定要在整流变压器的二次侧引出零线&#xff0c;所以二次侧绕组必须接成星形 一次绕组必须要…

小爱控制via电视浏览器搜索图片-Homeassistant重制上一个自动化

制作自动化详情 为了完成图片搜&#xff0c;暂定指令找找{描述} 在执行脚本的adb地方输入以下指令&#xff0c;百度 因安全不让在图片地址直接搜转用bing >- >am start -n mark.via.gp/mark.via.Shell -a android.intent.action.VIEW -d https://cn.bing.com/images/…

unity一个图片的物体,会有透明的效果

如图 想要去掉这个透明效果 选择一个高层级的layer即可。

docker网桥问题导致ldap组件安装失败分析解决

使用pass_install_x86_64_0124版部署k8s底座、kem&#xff1b; 问题&#xff1a;一台kem节点部署ldap组件失败 解决&#xff1a;恢复问题主机的docker0网卡&#xff0c;重新部署kem相关组件 二、问题详情 现象描述 ansible部署kem组件 TASK [kem : start ldap] **********…

【Python】pillow库学习笔记1-Image类

《Python语言程序设计基础 》第3版&#xff0c;嵩天 黄天羽 杨雅婷著&#xff0c;P293 1.pillow库概述 Pillow 库是Python图像处理重要的第三方库。 Pillow库是PIL (Python image library) 库的一个扩展&#xff0c;需要通过pip工具安装。安装PIL库需要注意&#xff0c;安装…