在项目开发过程中,文本处理是高频需求,正则表达式的应用越来越广泛。虽然其语法规则初看晦涩难懂,但掌握后能显著提升工作效率。
1.使用需求
在项目中的应用涉及到C/C++、NotePad++ 和 Python ,主要应用场景分为:
- C/C++:嵌入式系统 QT
- NotePad++:日常文本编辑和批量处理
- Python:数据处理、文本分析
2.基础知识(以C/C++为主)
2.1 基础概念
**正则表达式:**用来匹配和处理文本的模式
2.2 核心语法速查表
特殊字符
. // 匹配任意单个字符(除了换行符)
\d // 匹配数字 [0-9]
\w // 匹配字母、数字、下划线 [a-zA-Z0-9_]
\s // 匹配空白字符(空格、制表符等)
\D // 匹配非数字
\W // 匹配非字母数字下划线
\S // 匹配非空白字符
数量
* // 0次或多次
+ // 1次或多次
? // 0次或1次
{n} // 恰好n次
{n,} // 至少n次
{n,m} // n到m次
位置
^ // 字符串开始
$ // 字符串结束
\b // 单词边界
字符组
[abc] // 匹配a、b或c
[a-z] // 匹配a到z的任意字母
[^abc] // 匹配除了a、b、c的任意字符
2.3 应用细节
分组和捕获
//捕获分组
QString text = "2025-11-25";
QRegularExpression regex("(\\d{4})-(\\d{2})-(\\d{2})");
// 依次捕获到 2025 11 25
// 非捕获分组(?:)
QString text = "https://editor.youkuaiyun.com/md";
QRegularExpression regex("(?:https://)(\\w{6})");
// 只捕获到editor 不捕获 https://
选择符
// 匹配"红色"或"蓝色"或"绿色"
QRegularExpression colorRegex("红色|蓝色|绿色");
// 匹配: "红色", "蓝色", "绿色"
QRegularExpression flexibleOpen("(?:打开|显示|查看)(.+)");
// 匹配: 打开/显示/查看 后面的字符
基本应用实例
// 匹配“打开XXX"
QRegularExpression regex("打开(.+)");
// 匹配: "打开设置" → 捕获"设置"
// 匹配: "打开个人中心" → 捕获"个人中心"
// 匹配"切换到XXX页面"
QRegularExpression regex("切换(?:到)?(.+?)页面");
// 匹配: "切换到设置页面" → 捕获"设置"
// 匹配: "切换首页页面" → 捕获"首页"
// 匹配: "切换页面" → 捕获""
// 匹配多种表达方式
QRegularExpression flexibleOpen("(?:打开|显示|查看)(.+)");
// 匹配: "打开设置", "显示设置", "查看设置" → 捕获"设置"
// 匹配带可选参数的指令
QRegularExpression volumeRegex("把音量(?:调到|设置为)?(\\d+)");
// 匹配: "把音量调到50", "音量设置为80", "把音量70" → 捕获50 80 70
// [-/]? 匹配一个短横线 - 或者斜杠 /,这个符号出现 0 次或 1 次
2.4 快速记忆口诀
.- 任意字符*+?- 数量控制(零个多个、一个多个、零个一个)\d\w\s- 数字、字词、空白[]- 字符选择()- 分组捕获|- 或者选择^$- 开始结束
2.5 其它易错点
转义字符 \
为了匹配特殊字符本身,需要在前面加反斜杠 \ 进行转义:
// 匹配真正的点号
QRegularExpression regex3("a\\.b");
// 匹配: "a.b" ✓
// 不匹配: "aab", "acb" 等
// C++ 字符串中需要双反斜杠
QRegularExpression regex4("a\\.b"); // 实际模式: a\.b
其他需要转义的特殊字符:
// 括号需要转义
QRegularExpression regex1("\\(.*\\)"); // 匹配括号内容
// 匹配: "(hello)", "(123)"
// 方括号需要转义
QRegularExpression regex2("\\[.*\\]"); // 匹配方括号内容
// 匹配: "[hello]", "[123]"
// 花括号需要转义(当作为量词时)
QRegularExpression regex3("a\\{2\\}"); // 匹配 "a{2}"
// 不是匹配2个a,而是匹配字面值 "a{2}"
// 问号需要转义
QRegularExpression regex4("what\\?"); // 匹配 "what?"
// 不是0次或1次,而是真正的问号
// 加号需要转义
QRegularExpression regex5("1\\+1"); // 匹配 "1+1"
// 不是1次或多次,而是真正的加号
// 星号需要转义
QRegularExpression regex6("\\*.*\\*"); // 匹配 *内容*
// 不是0次或多次,而是真正的星号
字符组用法
// 匹配多种空白字符
QRegularExpression spaceRegex("[ \\t\\n]?"); // 空格、制表符、换行符出现0-1次
// 匹配非数字字符(0-1次)
QRegularExpression nonDigitRegex("[^0-9]?");
注意:否定字符组不会触发贪婪匹配问题
QString text2 = "(hello)(world)";
// 错误:贪婪匹配
QRegularExpression wrong("\\((.+)\\)");
// 匹配: "hello)(world" ← 匹配太多
// 正确:使用否定字符组
QRegularExpression correct("\\(([^)]+)\\)");
// 匹配: "hello" ← 正确
// 匹配过程:
// 1. 找到 "("
// 2. 开始匹配 [^)]+ → 匹配 "hello"(遇到第一个 ) 就停止
// 3. 匹配 ")" → 完成
3.C/C++、NotePad++ 和 Python 中应用差异
同一个例子:
QString text = "{x:1111},{y:./page0_main/page.cfg},{t:首页}";
要提取到 “1111”
- C/C++:
QString text = "{x:1111},{y:./page0_main/page.cfg},{t:首页}";
QRegularExpression regex("\\{x:([^}]+)");
QRegularExpressionMatch match = regex.match(text);
if(match.hasMatch()){
QString number = match.captured(1);
qDebug()<<"提取的数字:"<<number;
}
- NotePad++:
利用notepad++中的查找/替换功能:
// 查找内容:
\{x:(\d+)\}
// 替换为:
$1 或者 \1
$1 \1在正则表达式替换中表示:引用第一个捕获分组的内容
在替换操作中:
$1 代表第一个捕获分组的内容
$2 代表第二个捕获分组的内容
更多例子:
// 调换顺序
查找内容: (\w+),(\w+)
替换为: $2,$1
原始文本: 张三,李四
替换结果: 李四,张三
- Python:
text = "{x:1111},{y:./page0_main/page.cfg},{t:首页}"
p_match = re.search(r'{x:(.*?)}',text)
//提取{p:}括号里的内容
text2 = "TEXT, {x: 350},{y:60},{w:100},{h: 40},{p:警报}"
p_match = re.search(r'TEXT,.*?\{p:(.*?)\}',text)

1740

被折叠的 条评论
为什么被折叠?



