正则表达式在C/C++、NotePad++ 和 Python 中的应用差异总结

部署运行你感兴趣的模型镜像

在项目开发过程中,文本处理是高频需求,正则表达式的应用越来越广泛。虽然其语法规则初看晦涩难懂,但掌握后能显著提升工作效率。

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 快速记忆口诀
  1. . - 任意字符
  2. *+? - 数量控制(零个多个、一个多个、零个一个)
  3. \d\w\s - 数字、字词、空白
  4. [] - 字符选择
  5. () - 分组捕获
  6. | - 或者选择
  7. ^$ - 开始结束
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
  1. 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;
}
  1. NotePad++:
    利用notepad++中的查找/替换功能:
// 查找内容:
\{x:(\d+)\}

// 替换为:
$1 或者 \1

$1 \1在正则表达式替换中表示:引用第一个捕获分组的内容

在替换操作中:

$1 代表第一个捕获分组的内容

$2 代表第二个捕获分组的内容

更多例子:

// 调换顺序
查找内容: (\w+),(\w+)
替换为:   $2,$1

原始文本: 张三,李四
替换结果: 李四,张三
  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)

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值