C++中正则表达式详解和实战示例

C++ 中的正则表达式(Regular Expression)主要通过标准库 <regex> 提供,能够用于字符串匹配、查找、替换、验证格式等。它在 C++11 中首次引入,并在 C++14 和 C++17 中逐步完善。


一、头文件和命名空间

#include <regex>
#include <string>
#include <iostream>using namespace std;

二、主要类介绍

类名功能描述
std::regex用于存储正则表达式模式
std::smatch用于存储匹配结果(string 匹配)
std::cmatch用于存储匹配结果(C字符串匹配)
std::regex_match判断整个字符串是否匹配正则模式
std::regex_search判断字符串中是否有匹配正则的部分
std::regex_replace替换匹配的字符串内容

三、常见正则表达式语法

正则语法含义
.匹配任意单个字符
*匹配前面的字符 0 次或多次
+匹配前面的字符 1 次或多次
?匹配前面的字符 0 次或 1 次
^匹配字符串开头
$匹配字符串结尾
[]匹配方括号内任一字符
``或运算符
()子表达式分组
\d数字
\w单词字符(字母/数字/下划线)
\s空白字符

四、示例代码

1. 使用 regex_match 完全匹配

string s = "abc123";
regex pattern("[a-z]+\\d+"); // 小写字母 + 数字if (regex_match(s, pattern)) {cout << "完全匹配成功" << endl;
} else {cout << "匹配失败" << endl;
}

2. 使用 regex_search 局部匹配

string s = "hello 123 world";
regex pattern("\\d+"); // 匹配数字smatch result;
if (regex_search(s, result, pattern)) {cout << "找到数字:" << result.str() << endl;
}

3. 使用 regex_replace 字符替换

string s = "abc123xyz456";
regex pattern("\\d+"); // 匹配数字string replaced = regex_replace(s, pattern, "#");
cout << replaced << endl; // 输出:abc#xyz#

4. 捕获多个子匹配

string s = "Name: John, Age: 25";
regex pattern("Name: (\\w+), Age: (\\d+)");smatch match;
if (regex_search(s, match, pattern)) {cout << "姓名:" << match[1] << endl;cout << "年龄:" << match[2] << endl;
}

5. 匹配邮箱格式示例

string email = "user123@example.com";
regex pattern("[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}");if (regex_match(email, pattern)) {cout << "邮箱格式合法" << endl;
} else {cout << "邮箱格式错误" << endl;
}

五、匹配模式(flag)

正则对象可以设置模式:

regex pattern("abc", regex_constants::icase); // 忽略大小写

常用标志位:

标志名含义
regex_constants::icase忽略大小写
regex_constants::ECMAScript默认模式,支持现代语法
regex_constants::basic基本正则
regex_constants::extended扩展正则(如 POSIX)

六、性能提示

  • regex 在 C++11 初期实现性能一般,现代编译器已优化。
  • 对于频繁匹配,可复用 std::regex 对象,避免重复构造。
  • 若性能要求极高,可考虑 RE2 等替代库(Google)。

七、综合实战示例

下面以为 日志过滤文件名匹配表单验证 的完整 C++ 正则表达式示例,每个都附详细解释,帮助大家实际应用。


1、日志过滤:提取指定格式的日志(如错误信息)

目标:从日志中提取 [ERROR] 级别的信息

#include <iostream>
#include <regex>
#include <string>
#include <vector>using namespace std;int main() {vector<string> logs = {"[INFO] 2025-07-14 Connection established","[ERROR] 2025-07-14 Disk not found","[WARN] 2025-07-14 High memory usage","[ERROR] 2025-07-14 Timeout occurred"};regex error_pattern(R"(\[ERROR\]\s+(\d{4}-\d{2}-\d{2})\s+(.*))");for (const auto& log : logs) {smatch match;if (regex_match(log, match, error_pattern)) {cout << "日期: " << match[1] << ", 错误信息: " << match[2] << endl;}}return 0;
}

输出:

日期: 2025-07-14, 错误信息: Disk not found
日期: 2025-07-14, 错误信息: Timeout occurred

2、文件名匹配:匹配特定后缀的文件(如 .txt.log

#include <iostream>
#include <regex>
#include <vector>using namespace std;int main() {vector<string> filenames = {"report.txt", "data.csv", "log_2025.log", "notes.TXT", "script.cpp"};regex txt_log_pattern(R"((.*)\.(txt|log))", regex_constants::icase); // 忽略大小写cout << "匹配的文件名:" << endl;for (const auto& name : filenames) {if (regex_match(name, txt_log_pattern)) {cout << "  " << name << endl;}}return 0;
}

输出:

匹配的文件名:report.txtlog_2025.lognotes.TXT

3、表单验证:验证邮箱、手机号、密码强度

1. 邮箱验证

string email = "test_user-123@example.co.uk";
regex email_pattern(R"([\w\.-]+@[\w\.-]+\.[a-zA-Z]{2,})");cout << (regex_match(email, email_pattern) ? "邮箱合法" : "邮箱非法") << endl;

2. 手机号验证(中国大陆)

string phone = "13812345678";
regex phone_pattern(R"(1[3-9]\d{9})"); // 以1开头 + 合法段位 + 9位数字cout << (regex_match(phone, phone_pattern) ? "手机号合法" : "手机号非法") << endl;

3. 密码强度验证(8~16位,包含字母和数字)

string password = "Abc12345";
regex pwd_pattern(R"((?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16})");cout << (regex_match(password, pwd_pattern) ? "密码合法" : "密码不合法") << endl;

4、总结与推荐实践

场景推荐正则
日志提取^\[ERROR\].* 或带时间戳的模式
文件筛选`.*.(txtlog)$`
邮箱验证[\w\.-]+@[\w\.-]+\.[a-zA-Z]{2,}
手机号验证1[3-9]\d{9}
密码验证(?=.*[A-Za-z])(?=.*\d).{8,16}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89077.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析Avro、Protobuf与JSON:序列化技术的选择与应用

在现代分布式系统和数据交换场景中&#xff0c;序列化技术是数据存储、传输和通信的核心。本文深入探讨三种主流序列化技术&#xff1a;Avro、Protobuf 和 JSON&#xff0c;从背景、特点、示例代码&#xff08;Python&#xff09;、优势及最佳实践等多个维度进行对比分析&#…

Vue 中 effectScope() 的全面解析与实战应用

一、effectScope 概述1.1 什么是 effectScopeeffectScope() 是 Vue 3.2 引入的核心 API&#xff0c;用于创建副作用作用域容器。它能够将多个响应式副作用&#xff08;如 watch、watchEffect 和 computed&#xff09;组织在一起&#xff0c;实现统一的生命周期管理。1.2 核心价…

嵌入式面试八股文(十六)·一文搞懂嵌入式常用名词IC、ASIC、CPU、MPU、MCU、SoC、SoPC、GPU、DSP

目录 1. IC&#xff08;Integrated Circuit&#xff0c;集成电路&#xff09; 2. ASIC&#xff08;Application-Specific Integrated Circuit&#xff0c;专用集成电路&#xff09; 3. CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 4. M…

安全参綉25暑假第一次作业

第一天 1.首先讲了d0cker的部署&#xff0c; 这个是第一个Vulhub漏洞环境。所有环境都使用D0cker容器化&#xff0c;使其易于部署和隔离测试。 其中&#xff0c;国内的阿里用不了&#xff0c;你得搞个代理&#xff0c;下国外的&#xff1a;入门指南 | Vulhub 然后按这个…

RocketMQ源码级实现原理-消息消费总览

Overview可以看到&#xff0c;pull message和consume message实际上是两个过程&#xff0c;但是对于用户是透明的 注意这三个Offset的含义&#xff0c;physical offset就是commitLog中的全局偏移量分发dispatch如上图&#xff0c;Topic的每个queue&#xff0c;都绑定了唯一的一…

linux打包固件shell脚本

不打包 pack.sh解压后无父目录&#xff08;直接是文件&#xff09;生成 checksum.txt&#xff08;包含所有文件的 SHA256&#xff09;打包后 .tar.gz 移动到上级目录#!/bin/bash# 检查是否传入版本号参数 if [ -z "$1" ]; thenecho "Usage: $0 <version> …

用uniapp开发鸿蒙应用(暂停更新-根据项目更新,现在项目未开始)

1.根据博客生成.hap文件 【鸿蒙HarmonyOS开发技巧&#xff1a;如何不依赖华为商店直接安装uniapp生成的app文件&#xff1f;一键转换app至hap格式教程详解】_entry-default-signed.hap-CSDN博客 根据网络查询鸿蒙手机安装测试app&#xff0c;需要电脑命令安装 在鸿蒙HarmonyOS手…

Linux 文件系统实现层详解:原理、结构与驱动衔接

&#x1f4c2; Linux 文件系统实现层详解&#xff1a;原理、结构与驱动衔接 &#x1f3ac; 推荐搭配视频学习&#xff1a;Linux 文件系统子系统&#xff1a;三层架构全面掌握 一、为什么要重点理解文件系统实现层&#xff1f; 文件系统实现层是 Linux 文件系统的“地基”&…

区块链应用场景深度解读:金融领域的革新与突破

引言&#xff1a;区块链技术的演进与金融领域的变革区块链技术自2008年诞生以来&#xff0c;以其去中心化、不可篡改、可追溯等特性&#xff0c;在全球范围内引发了金融领域的深刻变革。从最初的数字货币实验&#xff0c;到如今在跨境支付、证券交易、供应链金融等领域的广泛应…

redisson tryLock

应用场景RLock rLock redissonClient.getLock(Constant_LOCK request.getId()); try {boolean isLocked rLock.tryLock();if (!isLocked) {throw new ServiceException(ErrConstant.OPERATION_FAILED, "请勿重复提交");}源码public interface RLock extends Lock,…

前端docx库实现将html页面导出word

前言&#xff1a;最近遇到一个需求&#xff0c;需要将页面的html导出为word文档&#xff0c;并且包含横向和竖向页面&#xff0c;并且可以进行混合方向导出。经过一段时间的实验&#xff0c;发现只有docx这个库满足这个要求。在这里记录一下实现思路以及代码。 docx官网 一、…

虚拟主机CPU占用100导致打不开的一次处理

背景 突然有一天&#xff0c;有个客户网站打不开了&#xff0c;发来这样一张图片问题排查 打开阿里云虚拟主机控制面板&#xff0c;CPU 使用率已经达到了100%&#xff0c;这说明网站已经在高负荷运转。分析访问日志发现&#xff0c;网站出现了大量循环路径&#xff0c;其 UserA…

设计模式之工厂模式:对象创建的智慧之道

工厂模式&#xff1a;对象创建的智慧之道 引言&#xff1a;为什么我们需要工厂模式&#xff1f; 在软件开发中&#xff0c;对象创建是最常见的操作之一。当代码中充满new关键字时&#xff0c;系统会面临三大痛点&#xff1a; 紧耦合&#xff1a;客户端代码直接依赖具体实现类扩…

Docker镜像制作案例

1、使用Docker commit制作镜像为ubuntu镜像提供ssh服务①&#xff1a;拉取镜像[rootopenEuler-1 ~]# docker pull ubuntu:18.04②&#xff1a;启动镜像[rootopenEuler-1 ~]# docker run --name c1 -it --rm ubuntu:18.04 bash③&#xff1a;替换aliyun源mv /etc/apt/sources.li…

KeilMDK5如何生成.bin文件

1&#xff1a;主要是要找到fromelf.exe的路径2&#xff1a;接下来要做的要视情况而定&#xff1a;选完fromelf.exe后在输入框中加个空格然后加一串字 : --bin -o ./Obj/L.bin ./Obj/L.axf&#xff0c;如下我设置的L最终会替换成项目名 3&#xff1a;去构建生成编译一下&#…

Ajax接收java后端传递的json对象包含长整型被截断导致丢失精度的解决方案

问题描述 在使用java编写代码的时候,后端返回前端的JSON对象中包含了Long长整型,前端接受的时候丢失了精度问题。 比如: 后端传递的json {"code": "200","msg": "操作成功","data":

MybatisPlus由浅入深

MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;旨在简化开发过程。基本使用步骤1.依赖引入<!-- mysql依赖 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>…

蓝牙信号强度(RSSI)与链路质量(LQI)的测量与应用:面试高频考点与真题解析

在蓝牙通信领域&#xff0c;信号强度&#xff08;RSSI&#xff09;和链路质量&#xff08;LQI&#xff09;是评估无线链路性能的核心指标。无论是智能家居设备的连接优化&#xff0c;还是工业物联网中的抗干扰设计&#xff0c;这两个指标都扮演着关键角色。本文将结合面试高频考…

PyTorch的计算图是什么?为什么绘图前要detach?

在PyTorch中&#xff0c;计算图&#xff08;Computational Graph&#xff09; 是自动求导&#xff08;Autograd&#xff09;的核心机制。理解计算图有助于解释为什么在绘图前需要使用 .detach() 方法分离张量。一、什么是计算图&#xff1f; 计算图是一种有向无环图&#xff08…

深度学习入门代码详细注释-ResNet18分类蚂蚁蜜蜂

本项目将基于PyTorch平台迁移ResNet18模型。该模型原采用ImageNet数据集&#xff08;含1000个图像类别&#xff09;进行训练。我们将尝试运用该模型对蚂蚁和蜜蜂进行分类&#xff08;这两个类别未包含在原训练数据集中&#xff09;。 本文的原始代码参考于博客深度学习入门项目…