news 2026/1/28 1:42:12

Qt基础篇:正则表达式基础知识QRegularExpression用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt基础篇:正则表达式基础知识QRegularExpression用法

1、正则表达式是什么?

正则表达式,又称规则表达式、常规表示法(Regular Expression,简写为 regex、regexp 或 RE),是计算机科学领域中对字符串操作的一种逻辑公式。它由事先定义好的特定字符及这些字符的组合构成一个 “规则字符串”,以此来表达对其他字符串的过滤逻辑,通常用于查找、替换符合特定特征的字符串,或者验证某个字符串是否满足指定要求。

2、基础语法入门

2.1 普通字符与元字符

正则表达式由普通字符和元字符组成。普通字符如字母、数字,精准匹配自身,像 “abc” 就严格匹配字符串中的 “abc”。

元字符则具特殊含义,“.” 可匹配除换行符外任意字符,如正则表达式 “a.c” 能匹配 “abc”“a1c” 等;“\d” 匹配数字,“\w” 匹配字母、数字、下划线,如 “\d\d” 匹配 “12”“34” 等两位数字组合,“\w+” 匹配连续字母数字下划线序列,像 “abc123”“_hello”。

二者结合,能构建复杂匹配模式,如 “\d {3}-\d {8}” 匹配常见的 3 位区号 - 8 位电话号码格式。

2.2 限定符

限定符用于控制字符出现次数。“” 表示前字符出现 0 次或多次,“a” 可匹配空串、“a”“aa” 等;“+” 要求前字符至少出现 1 次,“a+” 匹配 “a”“aa” 等,但不匹配空串;“?” 使前字符出现 0 次或 1 次,“colou?r” 匹配 “color”“colour”。

还可用大括号精准控制,“{n}” 指定出现 n 次,“\d {4}” 匹配 4 位数字;“{n,}” 至少 n 次,“\d {3,}” 匹配至少 3 位数字;“{n,m}” 出现次数介于 n 到 m,“\d {2,4}” 匹配 2 到 4 位数字。

如匹配手机号可用 “1 [3-9]\d {9}”,确保以 1 开头、第二位 3 - 9、后接 9 位数字;密码要求 6 - 12 位字母数字组合,可写成 “[a-zA-Z0-9]{6,12}”。

2.3 字符类与方括号表达式

字符类用方括号 “[]” 定义匹配字符范围,“[abc]” 匹配 “a”“b” 或 “c” 中任一字符,“[0-9]” 等价于 “\d” 匹配数字,“[a-zA-Z]” 匹配所有英文字母。

还可用连字符 “-” 指定范围,“[a-z]” 匹配小写字母,“[A-Z]” 匹配大写字母。与元字符相比,字符类适用于明确列举字符范围场景,元字符更侧重抽象类型匹配,如匹配身份证号中生日部分 “\d {4}(-\d {2}){2}”,用 “[0-9]” 替换 “\d” 也行,但前者表意更清晰;匹配单词首字母大写的单词,用 “[A-Z]\w*” 更便捷,体现二者适用差异。

// 选择符 (|)QRegularExpressionre("cat|dog|bird");// 匹配 "cat" 或 "dog" 或 "bird"// 转义特殊字符QRegularExpressionre1("\\.");// 匹配字面点 "."QRegularExpressionre2("\\(");// 匹配左括号 "("QRegularExpressionre3("\\$");// 匹配美元符号 "$"
2.4 分组与捕获

分组用括号 “()” 将字符组合成子表达式,使操作更灵活,如 “(ab)+” 匹配连续出现的 “ab” 组合,如 “abab”“ababab”。

捕获组能提取匹配子串供后续使用,默认从左到右编号,如 “(\d {4})-(\d {2})-(\d {2})” 匹配日期,可用编号在程序中引用对应部分。

QRegularExpressionre("pattern");// 常用选项re.setPatternOptions(QRegularExpression::CaseInsensitiveOption);// 忽略大小写re.setPatternOptions(QRegularExpression::MultilineOption);// 多行模式re.setPatternOptions(QRegularExpression::DotMatchesEverythingOption);// .匹配所有re.setPatternOptions(QRegularExpression::ExtendedPatternSyntaxOption);// 扩展语法// 组合多个选项re.setPatternOptions(QRegularExpression::CaseInsensitiveOption|QRegularExpression::MultilineOption);

非捕获组 “ ( ? : ) ” 只分组不捕获,用于仅需分组逻辑无需保存子串场景,如 “(?:\d {3})-(?:\d {8})” 匹配电话号码,不存储区号、号码子串,节省内存,提升效率,如提取姓名 “([A-Z][a-z]+) ([A-Z][a-z]+)”、日期 “(\d {4})-(?:\d {2})-(?:\d {2})” 时,合理运用分组与捕获,让文本处理事半功倍。

// 分组和捕获QRegularExpressionre("(\\d{4})-(\\d{2})-(\\d{2})");QRegularExpressionMatch match=re.match("2024-01-15");if(match.hasMatch()){QString year=match.captured(1);// "2024"QString month=match.captured(2);// "01"QString day=match.captured(3);// "15"QString full=match.captured(0);// "2024-01-15"}
// 命名捕获组 (?<name>pattern)QRegularExpressionre("^(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})$");QRegularExpressionMatch match=re.match("2024-01-15");if(match.hasMatch()){QString year=match.captured("year");// "2024"QString month=match.captured("month");// "01"QString day=match.captured("day");// "15"}
2.5 前向断言和后向断言
// 正向前瞻 (?=pattern)QRegularExpressionre1("\\w+(?=\\.cpp)");// 匹配 .cpp 前的单词// "main.cpp" → 匹配 "main"// 负向前瞻 (?!pattern)QRegularExpressionre2("\\d{3}(?!\\d)");// 匹配不是4位数字开头的3位数字// "123" → 匹配,"1234" → 不匹配// 正向后顾 (?<=pattern) - 需要设置模式选项QRegularExpressionre3("(?<=\\$)\\d+");// 匹配 $ 后的数字// "$100" → 匹配 "100"// 负向后顾 (?<!pattern)QRegularExpressionre4("(?<!\\$)\\d+");// 匹配不在 $ 后的数字

3、常用场景

3.1 邮箱验证

在日常的数据处理中,数据验证是确保信息准确性的关键一环,而正则表达式在其中扮演着举足轻重的角色。

以电子邮箱验证为例,一个合法的邮箱地址需要遵循特定的格式规范。其正则表达式通常为 “1+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+ ” 分别表示匹配字符串的开头和结尾,确保整个字符串完全符合规则;“[a-zA-Z0-9_.±]” 定义了邮箱用户名部分可出现的字符范围,涵盖字母、数字、点、下划线、加号和减号,“+” 限定用户名至少出现一个字符;“@” 是邮箱地址的固定分隔符;“[a-zA-Z0-9-]+” 用于匹配域名主体,如 “qq”“163” 等;最后的 “.[a-zA-Z0-9-.]+” 则表示域名后缀,像 “com”“net”“org” 以及国家顶级域名 “cn” 等。当用户在注册页面输入邮箱时,后端程序通过该正则表达式进行校验,若不符合则及时提示错误,避免无效数据录入。

boolisValidEmail(constQString&email){// 简单的邮箱验证正则QRegularExpressionre("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");re.setPatternOptions(QRegularExpression::CaseInsensitiveOption);QRegularExpressionMatch match=re.match(email);returnmatch.hasMatch();}// 测试qDebug()<<isValidEmail("user@example.com");// trueqDebug()<<isValidEmail("user.name@domain.co.uk");// trueqDebug()<<isValidEmail("invalid.email@");// false
3.2 手机号验证

手机号验证同样重要,随着移动互联网普及,精准识别手机号格式是众多业务基础。常见正则表达式如 “^1 [3-9]\d {9}$”,明确手机号以 “1” 开头,紧跟第二位是 “3” 到 “9” 中任一数字,后面再续接 9 位数字,精准匹配国内主流手机号码格式。无论是电商平台下单、社交软件注册,还是金融业务办理,此正则都保障了手机号录入的准确性,防止因格式错误引发后续流程问题。

boolisValidChinesePhone(constQString&phone){// 中国大陆手机号验证QRegularExpressionre("^(\\+86)?1[3-9]\\d{9}$");QRegularExpressionMatch match=re.match(phone);returnmatch.hasMatch();}// 测试qDebug()<<isValidChinesePhone("13800138000");// trueqDebug()<<isValidChinesePhone("+8613800138000");// trueqDebug()<<isValidChinesePhone("12800138000");// false
3.3 身份证号验证

身份证号验证更为严谨,关乎身份识别与信息安全。18 位身份证号正则 “2\d {5}(18|19|20)\d {2}((0 [1-9])|(1 [0-2]))(([0-2][1-9])|10|20|30|31)\d {3}[0-9Xx]$”,前六位 “[1-9]\d {5}” 匹配地址码,限定以非零数字开头后接 5 位数字,对应各地区行政区划代码;“(18|19|20)\d {2}” 精准定位出生年份,涵盖常见 1800 - 2099 年范围;“((0 [1-9])|(1 [0-2]))” 与 “(([0-2][1-9])|10|20|30|31)” 分别严格约束月份和日期,遵循日期逻辑;“\d {3}” 是顺序码;“[0-9Xx]” 为校验码,考虑到罗马数字 “X” 大写情况。政务系统、金融机构开户、交通票务预订等场景运用此正则,有效甄别身份证号合法性,保障业务有序开展。

3.4 URL 解析
voidparseUrl(constQString&url){QRegularExpressionre("^(https?|ftp)://([^/:]+)(?::(\\d+))?(/.*)?$");QRegularExpressionMatch match=re.match(url);if(match.hasMatch()){QString protocol=match.captured(1);// http, https, ftpQString host=match.captured(2);// 域名QString port=match.captured(3);// 端口QString path=match.captured(4);// 路径qDebug()<<"Protocol:"<<protocol;qDebug()<<"Host:"<<host;qDebug()<<"Port:"<<(port.isEmpty()?"default":port);qDebug()<<"Path:"<<(path.isEmpty()?"/":path);}}// 测试parseUrl("https://www.example.com:8080/path/to/page");
3.5 HTML 标签提取
QStringListextractHtmlTags(constQString&html){QStringList tags;QRegularExpressionre("<(\\w+)[^>]*>");QRegularExpressionMatchIterator i=re.globalMatch(html);while(i.hasNext()){QRegularExpressionMatch match=i.next();tags<<match.captured(1);// 标签名}returntags;}// 测试QString html="<div class='test'><p>Hello</p><br/><img src='...'/></div>";qDebug()<<extractHtmlTags(html);// ["div", "p", "br", "img"]
3.6 日期时间解析
boolparseDateTime(constQString&text,QDateTime&dt){QRegularExpressionre("^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})"// 日期"(?:\\s+"// 可选的时间部分"(\\d{1,2}):(\\d{2})(?::(\\d{2}))?"// 时:分:秒"(?:\\s+(AM|PM))?)?$",// 可选的上下午QRegularExpression::CaseInsensitiveOption);QRegularExpressionMatch match=re.match(text);if(!match.hasMatch())returnfalse;intyear=match.captured(1).toInt();intmonth=match.captured(2).toInt();intday=match.captured(3).toInt();dt.setDate(QDate(year,month,day));if(!match.captured(4).isEmpty()){inthour=match.captured(4).toInt();intminute=match.captured(5).toInt();intsecond=match.captured(6).isEmpty()?0:match.captured(6).toInt();// 处理 12 小时制QString ampm=match.captured(7).toUpper();if(ampm=="PM"&&hour<12)hour+=12;if(ampm=="AM"&&hour==12)hour=0;dt.setTime(QTime(hour,minute,second));}returndt.isValid();}
3.7 QString 的正则方法
QString text="Hello 123 World 456";// 替换QString replaced=text.replace(QRegularExpression("\\d+"),"###");// "Hello ### World ###"// 分割QStringList parts=text.split(QRegularExpression("\\s+"));// ["Hello", "123", "World", "456"]// 检查是否包含boolcontainsNumber=text.contains(QRegularExpression("\\d{3}"));// true// 查找位置intpos=text.indexOf(QRegularExpression("\\d{3}"));// 6 (123的位置)
3.8 文本提取

在当今数字化时代,海量信息扑面而来,从繁杂文本中精准提取关键信息成为诸多工作的必备技能,正则表达式无疑是这一过程中的得力工具。

在网页数据抓取领域,假设你正为撰写一篇行业研究报告收集资料,需要从众多网页中提取产品价格信息。网页源代码里,价格数据常夹杂在大量 HTML 标签与文本间,形如 “¥199.00”。此时,运用正则表达式 “(.?)” 就能直击要害,“” 与 “” 精准定位包裹价格文本的标签,括号及 “.?” 开启捕获组,以非贪婪模式匹配其间任意字符,抓取如 “¥199.00” 的价格数据,后续利用编程语言进一步清洗、转换,即可为报告所用。

日志文件分析场景中,系统运维人员每日面对海量日志,从中快速定位故障时间戳至关重要。日志记录格式或为 “[2024-08-15 12:30:05] ERROR: System crashed”,借助正则 “”,能迅速抽取 “[2024-08-15 12:30:05]” 时间戳信息,通过统计、排序这些时间数据,运维人员可精准回溯系统异常时段,排查问题根源,保障系统稳定运行,其高效性与精准度远胜手动逐行查阅。

3.9 搜索与替换

无论是日常文档处理,还是代码编写维护,搜索与替换操作频繁出现,正则表达式为其注入强大动力,极大提升效率。 在文本编辑器里,处理一篇长篇文稿时,若需将文中所有 “color” 统一替换为 “colour”,普通查找替换需多次手动确认,易有遗漏。

启用正则表达式,查找 “color”,替换为 “colour”,编辑器依规则瞬间全局精准替换,确保无一疏漏。又如调整文档格式,将所有数字序号 “1.”“2.” 等替换为 “(1)”“(2)”,正则 “\d+.” 匹配数字加 “.” 组合,替换为 “(\d+)”,一步到位完成格式转换,让文档排版整齐规范。

代码编写环节,正则更是不可或缺。大型项目代码注释风格不一,为统一规范、提升可读性,需批量处理。如将 “// 这是注释” 格式统一为 “/ 这是注释 /”,在代码编辑器或借助脚本工具,用正则 “// (.)” 匹配单行注释内容,替换为 “/ \1 */”,其中 “\1” 引用捕获组内容,自动转换注释格式,维护代码库整洁,助于团队协作开发,降低理解成本,让代码如精密齿轮组高效运转。


  1. a-zA-Z0-9_.± ↩︎

  2. 1-9 ↩︎

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/27 17:55:13

三部架构与 Banana2 快速对接:核心方案与实用代码

三部架构与Banana2快速对接&#xff1a;核心方案实用代码 本文聚焦三部架构&#xff08;接入层、计算层、存储层&#xff09;与Banana2模型的高效对接&#xff0c;精简核心技术路径&#xff0c;补充可直接落地的代码片段&#xff0c;兼顾实用性与技术性&#xff0c;助力快速解…

作者头像 李华
网站建设 2025/12/21 4:47:49

【GRPC 和 HTTP】设计目标和底层实现

文章目录一、核心维度对比表二、关键差异拆解1. 序列化&#xff1a;JSON vs Protobuf&#xff08;性能核心差距&#xff09;2. 传输协议&#xff1a;HTTP/1.1 vs HTTP/2&#xff08;并发能力差距&#xff09;3. 通信模式&#xff1a;单向请求 vs 多模式流式4. 接口契约&#xf…

作者头像 李华
网站建设 2026/1/25 20:30:08

littlefs v2到v3版本升级:10大关键技术特性深度解析

littlefs v2到v3版本升级&#xff1a;10大关键技术特性深度解析 【免费下载链接】littlefs A little fail-safe filesystem designed for microcontrollers 项目地址: https://gitcode.com/GitHub_Trending/li/littlefs littlefs是一个专为微控制器设计的轻量级故障安全…

作者头像 李华
网站建设 2026/1/28 7:47:54

macOS iSCSI Initiator终极指南:免费扩展存储空间的完整方案

macOS iSCSI Initiator终极指南&#xff1a;免费扩展存储空间的完整方案 【免费下载链接】iSCSIInitiator iSCSI Initiator for macOS 项目地址: https://gitcode.com/gh_mirrors/is/iSCSIInitiator 还在为MacBook存储空间不足而烦恼吗&#xff1f;macOS iSCSI Initiato…

作者头像 李华
网站建设 2026/1/24 0:12:17

pcb-tools终极指南:5步搞定PCB文件可视化

pcb-tools终极指南&#xff1a;5步搞定PCB文件可视化 【免费下载链接】pcb-tools Tools to work with PCB data (Gerber, Excellon, NC files) using Python. 项目地址: https://gitcode.com/gh_mirrors/pc/pcb-tools PCB设计新手面对Gerber、Excellon等专业制造文件时&…

作者头像 李华