当前位置:首页>python>《C++/Qt/Python/JS通用!正则符号终极图谱!》

《C++/Qt/Python/JS通用!正则符号终极图谱!》

  • 2026-10-10 12:18:40
《C++/Qt/Python/JS通用!正则符号终极图谱!》

今天我们整理一份通用的正则符号大词典。不管是写C++、Python、JavaScript还是Go,这些符号就像26个英文字母,走到哪用到哪!随时便于大家使用查询(代码示例用C++/Qt和通用伪代码混合)

第一章:📌 锚点 —— 正则里的“定位系统”

它们不占字符位置,只管“你在哪”。

cpp
// C++ Qt 示例:只匹配整个字符串刚好是"OK"的QRegularExpression re(R"(^OK$)"); // 匹配"OK" ✅,不匹配"OK!" ❌,不匹配" OK" ❌

第二章:🎯 通配与字符类 —— 正则里的“模糊搜索”

2.1 万能的点(.)

含义:匹配除换行符\n外的任意单个字符(多数语言默认如此)。

 a.c → 匹配 “abc”、“a*c”、“a c”,但不匹配 “ac”(中间缺一个)。

💀 巨坑:如果想匹配字面量的点,必须写成 .!

2.2 方括号 […] —— 自定义“秀池”

2.3 预定义快捷字符(都是统一的)

cpp
// 匹配一个标准手机号(简单版):1开头,后面跟10个数字QRegularExpression re(R"(^1\d{10}$)");

第三章:⚡ 量词 —— 控制“重复次数”的美学

这些符号修饰前面的那个原子(字符或分组)。

🔥 致命操作:贪婪 vs 懒惰

默认情况下,所有量词都是贪婪的——因为它们会吃掉尽可能多的字符。

<.+> 匹配 <div>text</div> → 它会整个匹配 <div>text</div>(因为.可以匹配>)!

想要懒惰(非贪婪)?在量词后面加个 ?:

<.+?> → 匹配 <div>(碰到第一个>就停)。

第四章:🧩 分组与引用 —— 正则中的“复制粘贴”

4.1 捕获分组 (…)

圆括号干两件事:优先计算(改变优先级)+ 内存缓存(捕获文本)。

(ab)+ → 匹配 “abab”,捕获到 “ab”(最后一次)。

cpp
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 中这样用:

cpp
QRegularExpression re(R"(^hello)", QRegularExpression::CaseInsensitiveOption);

常用通用标志:

内嵌用法:(?i)hello → 匹配 “HELLO”、“Hello”。

 组合:(?im)pattern。

🎬 实战:一行代码提取所有图片链接

cpp
#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)(改天换地)

如果觉得有用,欢迎大家点赞、关注、推荐、转发,能让更多的人看到学习!感谢大家的支持!

最新文章

随机文章