第四章:🧩 分组与引用 —— 正则中的“复制粘贴”
4.1 捕获分组 (…)
圆括号干两件事:优先计算(改变优先级)+ 内存缓存(捕获文本)。
(ab)+ → 匹配 “abab”,捕获到 “ab”(最后一次)。
QRegularExpression re(R"((\d{2})-(\d{2}))");// 匹配 "12-34",captured(1)="12",captured(2)="34"
4.2 反向引用 \1、\2……
在正则表达式内部引用前面捕获组匹配到的具体内容(不是匹配规则!)。
(.)\1 → 匹配任意两个相同字符("aa"、"!!")。
<(\w+)>.*<\/\1> → 匹配 <div>...</div>,确保前后标签名一致!
⚠️ C++的std::regex支持反向引用,但QRegularExpression(PCRE)也完美支持!
4.3 非捕获分组 (?:…)
只分组,不缓存。提高性能,节省内存。
(?:http|ftp):// → 匹配协议,但不保存协议名(如果你不需要提取它)。
4.4 命名捕获(现代语言支持)
(?…) 或 (?‘name’…)
Qt 和 C++ (ECMAScript) 支持:(?<Year>\d{4}),然后用 match.captured("Year")。
第五章:👻 断言(零宽断言)—— 不占位置
它们只匹配位置,不匹配字符,所以叫“零宽度”。
💡 兼容性警告:后顾断言(?<=)在 C++ std::regex(ECMAScript)中不支持!但在 Qt 的 QRegularExpression(PCRE)中完美支持。这是巨大的差别!
第六章:🔀 选择符 | —— 正则里的“或者”
优先级最低,相当于条件分支。
cat|dog → 匹配 “cat” 或 “dog”。
张三|李四 → 匹配两个名字。
结合分组使用:(apple|banana) pie → 匹配 “apple pie” 或 “banana pie”。
第七章:🏴 模式修饰符(标志)—— 改变世界观的开关
在 Qt 中这样用:
QRegularExpression re(R"(^hello)", QRegularExpression::CaseInsensitiveOption);
常用通用标志:
内嵌用法:(?i)hello → 匹配 “HELLO”、“Hello”。
组合:(?im)pattern。
🎬 实战:一行代码提取所有图片链接
#include<QRegularExpression>#include<QDebug>intmain(){ QString html = "<img src='a.jpg'><img src=\"b.png\">";// 非贪婪匹配,捕获引号内的内容QRegularExpression re(R"(src\s*=\s*['""](.+?)['""])", QRegularExpression::CaseInsensitiveOption); QRegularExpressionMatchIterator it = re.globalMatch(html);while (it.hasNext()) { QRegularExpressionMatch match = it.next();qDebug() << match.captured(1); // 输出 "a.jpg" 和 "b.png" }}
📝 最后脑图总结(可截图保存)
a)找位置:^ $ \b \A(定位用)
b)找字符:. \d \w \s […](模糊查) c)数次数:* + ? {n,m}(记着加?变懒惰)
d)存内容:(…) \1 (?…)(提取神器)e)看前后:(?=…) (?<=…) (?!…) (?<!…)(高级装逼必备)
f)分条件:|(或者)
g)开模式:(?i) (?s)(改天换地)
如果觉得有用,欢迎大家点赞、关注、推荐、转发,能让更多的人看到学习!感谢大家的支持!