Qt 正则表达式(QRegularExpression类)详解

Qt 正则表达式(QRegularExpression类)详解

Qt 正则表达式(QRegularExpression类)详解

一、正则表达式介绍

正则表达式(Regular Expression,简称 Regex)是一种用于描述文本模式的强大工具。它通过特定的语法规则,定义字符串的匹配模式,常用于文本的搜索、匹配、替换和验证操作。正则表达式在文本处理、数据清洗、表单验证等场景中应用广泛。


1、核心语法规则

以下是正则表达式的常用语法元素:

符号含义
.匹配任意单个字符(除换行符)
*匹配前一个字符零次或多次
+匹配前一个字符一次或多次
?匹配前一个字符零次或一次
\d匹配数字(等价于 [0-9]
\w匹配字母、数字或下划线(等价于 [a-zA-Z0-9_]
\s匹配空白字符(空格、制表符等)
[abc]匹配方括号内的任意一个字符(如 abc
[^abc]匹配不在方括号内的任意字符
(abc)分组,将多个字符视为一个单元
^匹配字符串开头
$匹配字符串结尾
|逻辑或(如 a|b 匹配 ab

2、实用示例

假设需要验证一个电话号码格式(如 138-1234-5678),可用以下正则表达式:

^\d{3}-\d{4}-\d{4}$ 
  • ^$ 确保匹配整个字符串
  • \d{3} 匹配3位数字
  • - 匹配连字符

3、常用场景

  1. 数据提取
    从日志中提取IP地址:\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

表单验证
邮箱格式校验:

^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$ 

文本替换
将日期格式 2023/08/15 替换为 2023-08-15

(\d{4})/(\d{2})/(\d{2}) 

替换为:$1-$2-$3


4、常用正则表达式

用途描述正则表达式示例匹配值
电子邮箱地址^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$[email protected]
中国大陆手机号^1[3-9]\d{9}$13800138000
日期格式 (YYYY-MM-DD)^\d{4}-\d{2}-\d{2}$2023-08-15
中文汉字^[\u4e00-\u9fa5]+$你好世界
身份证号 (15/18位)^(\d{15}|\d{17}[\dXx])$11010519900101123X
IP地址^\d{1,3}(\.\d{1,3}){3}$192.168.0.1
强密码 (8-20位含大小写字母、数字、特殊字符)^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,20}$Passw0rd!
整数(含负数)^-?\d+$-42, 100
特殊字符检测[<>"';&\\]<script>

💡 提示:实际使用时建议根据具体场景调整表达式边界(如添加 ^...$ 严格匹配),并使用在线测试工具验证匹配效果。


5、工具推荐

  • 在线测试:RegExr
  • 代码支持:Python 的 re 模块、JavaScript 的 RegExp 对象

二、 QRegularExpression类详解

QRegularExpression 是 Qt6 中用于处理正则表达式的核心类。它提供了强大且高效的字符串模式匹配功能,遵循 Perl 兼容的正则表达式语法(PCRE)。在 Qt6 中,它替代了旧的 QRegExp 类,并提供了更好的性能、功能完整性和 Unicode 支持。

1、核心功能

  • 模式匹配: 检查字符串是否匹配给定的模式。
  • 捕获匹配: 提取与正则表达式中定义的子模式(捕获组)匹配的子字符串。
  • 全局匹配: 查找字符串中所有出现的匹配项。
  • 字符串操作: 支持查找、替换、分割等基于正则表达式的操作(通常结合 QString 的相关方法)。

2、基本使用步骤

    • "subject string" 是要匹配的目标字符串。
    • offset (可选) 指定开始匹配的起始位置。
    • matchType (可选) 指定匹配选项(如部分匹配、锚定匹配等)。

获取捕获组:
正则表达式中的圆括号 () 定义捕获组。

// 假设模式为 "^(\\d+)-(\\d+)$" (匹配 "123-456")int group1 = match.captured(1).toInt();// 获取第一个捕获组 "123"int group2 = match.captured(2).toInt();// 获取第二个捕获组 "456" QString entireMatch = match.captured(0);// 获取整个匹配 "123-456"

检查匹配结果:

if(match.hasMatch()){// 成功匹配 QString matched = match.captured(0);// 获取整个匹配的字符串// ... 处理匹配结果}else{// 未匹配if(match.hasPartialMatch()){// 存在部分匹配(如果启用了相关选项)}}

进行匹配:

QRegularExpressionMatch match = re.match("subject string");

或者

QRegularExpressionMatch match = re.match("subject string", offset, matchType);

创建正则表达式对象:

QRegularExpression re("pattern");

其中 "pattern" 是您的正则表达式字符串。

3、常用方法

  • bool isValid() const: 检查正则表达式模式语法是否有效。
  • QString errorString() const: 如果无效,获取错误信息。
  • QString pattern() const: 获取当前设置的正则表达式模式。
  • void setPattern(const QString &pattern): 设置新的正则表达式模式。
  • void setPatternOptions(QRegularExpression::PatternOptions options): 设置匹配选项(如忽略大小写 CaseInsensitiveOption、多行模式 MultilineOption 等)。
  • int captureCount() const: 获取捕获组的数量(不包括第 0 组)。
  • QRegularExpressionMatchIterator globalMatch(const QString &subject) const: 获取一个迭代器,用于遍历字符串中所有匹配项。

4、全局匹配示例

查找字符串中所有出现的单词:

QString text ="The quick brown fox jumps over the lazy dog."; QRegularExpression re("\\b\\w+\\b");// 匹配单词边界之间的字符 QRegularExpressionMatchIterator i = re.globalMatch(text);while(i.hasNext()){ QRegularExpressionMatch match = i.next();qDebug()<< match.captured(0);// 输出: "The", "quick", "brown", ...}

5、模式选项

可以通过 setPatternOptions 或使用内联标记设置选项:

// 忽略大小写 QRegularExpression re("hello", QRegularExpression::CaseInsensitiveOption); re.match("Hello");// 匹配成功// 内联标记 (?i) QRegularExpression re("(?i)hello"); re.match("Hello");// 匹配成功

常用选项:

  • NoPatternOption: 无选项(默认)。
  • CaseInsensitiveOption: 忽略大小写。
  • DotMatchesEverythingOption: . 匹配包括换行符在内的任何字符。
  • MultilineOption: ^$ 匹配每行的开始和结束,而非整个字符串。
  • ExtendedPatternSyntaxOption: 忽略未转义空格和 # 后的注释。
  • InvertedGreedinessOption: 反转 *+ 的贪婪性(使其不贪婪)。
  • DontCaptureOption: 非命名捕获组不捕获(仅命名捕获组有效)。
  • UseUnicodePropertiesOption: 使 \w, \d 等字符类遵循 Unicode 属性。

6、常见用例示例

6.1、验证电子邮件地址 (简化版)

QRegularExpression emailRe("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"); QString email ="[email protected]";if(emailRe.match(email).hasMatch()){qDebug()<<"Valid email";}else{qDebug()<<"Invalid email";}

6.2、提取 URL 协议和域名

QString url ="https://www.example.com/path"; QRegularExpression urlRe("^(https?)://([^/]+)"); QRegularExpressionMatch match = urlRe.match(url);if(match.hasMatch()){ QString protocol = match.captured(1);// "http" 或 "https" QString domain = match.captured(2);// "www.example.com"}

6.3、替换所有数字

QString text ="Order 123, Item 456"; QRegularExpression digitRe("\\d+"); QString result = text.replace(digitRe,"NUM");// 结果: "Order NUM, Item NUM"

7、注意事项

  • 语法: 确保熟悉 Perl 兼容正则表达式语法。
  • 转义: 在 C++ 字符串中,反斜杠 \ 需要转义为 \\(例如,\d 应写作 "\\d")。
  • 性能: 对于非常复杂的模式或极长的字符串,注意性能影响。考虑优化正则表达式或使用其他字符串处理方法。
  • 错误处理: 始终检查 isValid() 并在无效时查看 errorString()
  • Qt 版本:QRegularExpression 是 Qt5.1 引入的,在 Qt6 中是主要的正则表达式处理类。

三、代码示例

1、效果展示

在这里插入图片描述

2、源码分享

#include"mainwindow.h"#include"ui_mainwindow.h"#include<QCoreApplication>#include<QJsonDocument>#include<QJsonObject>#include<QJsonArray>#include<QJsonValue>#include<QDebug>#include<QFile>#include<QRegularExpression>MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow){ ui->setupUi(this);}MainWindow::~MainWindow(){delete ui;}voidMainWindow::on_pushButton_clicked(){// 示例1:基础匹配 QString text ="Qt 6.2 released on 2021-09-30"; QRegularExpression datePattern(R"(\d{4}-\d{2}-\d{2})"); QRegularExpressionMatch match = datePattern.match(text);if(match.hasMatch()){qDebug()<<"找到日期:"<< match.captured(0);// 输出: "2021-09-30"}// 示例1:全局匹配(查找所有) QString html ="<p>Hello <b>World</b>!</p>"; QRegularExpression tagPattern(R"(<(\w+)>(.*?)</\1>)"); QRegularExpressionMatchIterator it = tagPattern.globalMatch(html);while(it.hasNext()){ QRegularExpressionMatch tagMatch = it.next();qDebug()<<"标签:"<< tagMatch.captured(1)<<"内容:"<< tagMatch.captured(2);// 输出:// 标签: "b" 内容: "World"// 标签: "p" 内容: "Hello <b>World</b>!"}// 示例3:替换操作 QString phone ="Tel: (123) 456-7890"; QRegularExpression phonePattern(R"(\((\d{3})\)\s(\d{3})-(\d{4}))"); QString formatted = phone.replace(phonePattern,R"(\1-\2-\3)");qDebug()<<"格式化电话:"<< formatted;// 输出: "Tel: 123-456-7890"}
在这里插入图片描述

Read more

Copilot指令设计原则,构建企业级AI辅助开发体系的关键

第一章:Copilot指令设计原则,构建企业级AI辅助开发体系的关键 在企业级开发环境中,GitHub Copilot 不仅是代码补全工具,更是提升开发效率、统一编码规范的重要支撑。要充分发挥其潜力,必须建立科学的指令设计原则,确保生成代码的可维护性、安全性和一致性。 明确上下文与意图 Copilot 的输出质量高度依赖输入指令的清晰度。开发者应提供完整的方法签名、注释说明和业务背景。例如,在编写用户认证逻辑时,使用结构化注释引导生成: // AuthenticateUser 验证用户凭据并返回token // 输入:用户名、密码 // 输出:JWT token 或错误信息 // 安全要求:密码需使用 bcrypt 校验 func AuthenticateUser(username, password string) (string, error) { // Copilot 将基于上述注释生成符合安全规范的实现 } 标准化指令模板 企业应制定统一的注释与指令规范,确保团队成员生成的代码风格一致。推荐使用以下结构: * 功能描述:简明说明函数目的 * 输入输出:

【人工智能】异构算力重构AIGC | 蓝耘智算平台部署通义万相2.1文生图技术全解析

【人工智能】异构算力重构AIGC | 蓝耘智算平台部署通义万相2.1文生图技术全解析

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 蓝耘智算平台 * 通义万相2.1文生图 * 优势 * 模型效果对比 * 蓝耘智算平台 * 登陆注册 * 蓝耘:通义万相2.1文生图的配置部署 * 使用实例 * 总结 前言:在人工智能(AI)技术日新月异的今天,AIGC(生成式人工智能内容生成)作为新兴领域,正以前所未有的速度改变着内容创作的格局。随着数据规模、算法复杂度的不断攀升,算力需求也呈现出爆发式增长的趋势。在这一背景下,异构算力作为提升算力效率与灵活性的关键手段,正逐渐成为推动AIGC技术发展的核心驱动力。 在AIGC技术指数级进化的浪潮下,文生图模型的参数量已突破千亿级门槛,据Stability AI最新报告显示,单次1080P图像生成的算力消耗较两年前激增320%,传统同构计算架构面临显存墙、能耗比失衡、硬件利用率不足等多重挑战。蓝耘智算平台通过革命性的异构算力重构方案,成功部署通义万相2.1这一业界领先的文生图大模型,开创了"算法-算力-场景"三位一体的AIGC工业化新范式。 蓝耘智算平台

paperxie 毕业论文:本科论文全流程智能写作神器,12000 字高质量论文一键生成

paperxie 毕业论文:本科论文全流程智能写作神器,12000 字高质量论文一键生成

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippt https://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 在本科阶段,毕业论文无疑是检验四年学习成果的 “终极大考”。从选题定题、文献搜集、框架搭建,到内容撰写、格式规范、查重降重,每一个环节都让无数本科生倍感压力。尤其是 12000 字的本科毕业论文,不仅要求内容详实、逻辑严谨,更要贴合学术规范,不少学子在写作过程中陷入 “选题迷茫、文献匮乏、内容空洞、格式混乱” 的困境,耗费大量时间却难以达到理想效果。 而 paperxie 论文写作平台的本科毕业论文写作功能,凭借全流程智能化、本土化适配、

5分钟部署Meta-Llama-3-8B-Instruct,vLLM+Open-WebUI打造最佳对话应用

5分钟部署Meta-Llama-3-8B-Instruct,vLLM+Open-WebUI打造最佳对话应用 1. 引言:为什么选择Meta-Llama-3-8B-Instruct构建对话系统? 随着大模型在自然语言理解与生成能力上的持续突破,越来越多开发者希望在本地或私有环境中快速搭建高性能的对话应用。Meta-Llama-3-8B-Instruct 作为2024年发布的中等规模指令微调模型,凭借其出色的英语表现、强大的指令遵循能力和对单卡推理的友好支持,成为轻量级对话系统的理想选择。 尤其当它与 vLLM(高吞吐推理引擎)和 Open-WebUI(类ChatGPT可视化界面)结合时,能够实现从“模型加载”到“交互体验”的全流程优化。本文将带你通过一个预配置镜像,在5分钟内完成整个系统部署,并深入解析其技术架构与工程实践要点。 本方案适用于: - 希望快速验证大模型对话能力的研究者 - 需要英文客服助手或代码辅助工具的开发者 - 想在消费级显卡(如RTX 3060/4090)上运行高质量模型的技术爱好者 2. 核心组件解析:vLLM + Open-WebUI 架构优势