C++正则表达式基础
文章目录
- 1. 查找第一个匹配的
- 2. 查找所有结果
- 3. 打印匹配结果的上下文
- 4. 使用子表达式
- 5. 查找并替换
注意:
.
(点)在括号中没有特殊含义,无需转义用\
转义。
1. 查找第一个匹配的
#include <iostream>
#include <regex>using namespace std;int main(void)
{string pattern = "[^c]ei";pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";regex policy(pattern); string text = "receipt freind theif receive";smatch results;if(regex_search(text, results, policy))cout << results.str() << endl;
}
输出结果:
freind
2. 查找所有结果
#include <iostream>
#include <regex>using namespace std;int main (void)
{string pattern = "[^c]ei";pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";// 忽略大小写regex policy (pattern, regex::icase);string text = "receipt freind theif receive";for (sregex_iterator it (text.begin(), text.end(), policy), end_it;it != end_it; ++it)cout << it->str() << endl;
}
其中,比较难理解的是sregex_iterator it (text.begin(), text.end(), policy), end_it
,这行代码是定义了it
迭代器来进行遍历查询,end_it
为空sregex_iterator
,起到尾后迭代器的作用。
输出结果:
freind
theif
3. 打印匹配结果的上下文
#include <iostream>
#include <regex>using namespace std;string text ="Once there were two mice. They were friends. One mouse ""lived in the country; the other mouse lived in the city.""After many years the Country mouse saw the City mouse;""he said, \"Do come and see me at my house in the country.""\" So the City mouse went. The City mouse said, \"This food""is not good, and your house is not good. Why do you live ""in a hole in the field? You should come and live in the ""city. You would live in a nice house made of stone. You ""would have nice food to eat. You must come and see me at""my house in the city.\"The Country mouse went to the house""of the City mouse. It was a very good house. Nice food ""was set ready for them to eat. But just as they began to""eat they heard a great noise. The City mouse cried, \" Run""! Run! The cat is coming!\" They ran away quickly and hid"".After some time they came out. When they came out, the ""Country mouse said, \"I do not like living in the city.""I like living in my hole in the field. For it is nicer""to be poor and happy, than to be rich and afraid.";int main (void)
{string pattern = "you";pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";regex policy (pattern, regex::icase);for (sregex_iterator it (text.begin(), text.end(), policy), end_it;it != end_it ; ++it) {auto pos = it->prefix().length();pos = pos > 40 ? pos - 40 : 0;cout << it->prefix().str().substr (pos)<< "\n\t\t>>> "<< it->str()<< " <<<\n"<< it->suffix().str().substr (0, 40)<< endl;}}
输出结果:
mouse said, "This foodis not good, and >>> your <<<house is not good. Why do you live in ahouse is not good. Why do >>> you <<<live in a hole in the field? You shouldlive in a hole in the field? >>> You <<<should come and live in the city. You wshould come and live in the city. >>> You <<<would live in a nice house made of ston
uld live in a nice house made of stone. >>> You <<<would have nice food to eat. You must cwould have nice food to eat. >>> You <<<must come and see me atmy house in the
4. 使用子表达式
#include <iostream>
#include <regex>using namespace std;string text ="Once there were two mice. They were friends. One mouse ""lived in the country; the other mouse lived in the city.""After many years the Country mouse saw the City mouse;""he said, \"Do come and see me at my house in the country.""\" So the City mouse went. The City mouse said, \"This food""is not good, and your house is not good. Why do you live ""in a hole in the field? You should come and live in the ""city. You would live in a nice house made of stone. You ""would have nice food to eat. You must come and see me at""my house in the city.\"The Country mouse went to the house""of the City mouse. It was a very good house. Nice food ""was set ready for them to eat. But just as they began to""eat they heard a great noise. The City mouse cried, \" Run""! Run! The cat is coming!\" They ran away quickly and hid"".After some time they came out. When they came out, the ""Country mouse said, \"I do not like living in the city.""I like living in my hole in the field. For it is nicer""to be poor and happy, than to be rich and afraid.";int main (void)
{string pattern = "! The (.*?)(coming)[[:alnum:]]*";regex policy (pattern);for (sregex_iterator it (text.begin(), text.end(), policy), end_it; it != end_it ; ++it) {cout << "总表达式\n\t" << it->str() << "\n";if ( (*it) [1].matched)cout << "第1个子表达式\n\t" << it->str (1) << "\n";if ( (*it) [2].matched)cout << "第2个子表达式\n\t" << it->str (2);}}
输出结果:
总表达式! The cat is coming
第1个子表达式cat is
第2个子表达式coming
5. 查找并替换
regex_replace()
用于查找并替换,
#include <iostream>
#include <regex>
#include <sstream>using namespace std;static const string text ="morgan (201) 555-2368 862-555-0123\n""drew (973)555.0130\n""lee (609) 555-0132 2015550175 800.555-0000";
int main (void)
{string phone_pattern ="(\\()?" //可选左括号"(\\d{3})" //区号"(\\))?" //可选右括号"([-. ])?" //可选分隔符"(\\d{3})" //前三位"([-. ])?" //可选分隔符"(\\d{4})"; //后四位regex policy (phone_pattern);string format = "$2.$5.$7";//格式为 xxx.xxx.xxxxistringstream input (text);string line;while (getline (input, line)) {cout << regex_replace (line, policy, format) << endl;}
}
运行结果:
morgan 201.555.2368 862.555.0123
drew 973.555.0130
lee 609.555.0132 201.555.0175 800.555.0000
其中format
中的$n
表示第n个子表达式。
默认情况下,regex_replace
会输出整个输入序列。
未与正则表达式匹配的部分会原样输出,匹配的部分按照格式字符来输出。
如果只想要匹配的部分,我们可以通过添加format_no_copy
标志:
string fmt = "$2.$5.$7 "
cout << regex_replace (line, policy, format, regex_constants::format_no_copy) << endl;
此时输出结果:
201.555.2368 862.555.0123
973.555.0130
609.555.0132 201.555.0175 800.555.0000
标准库定义了用来在替换过程中控制匹配或格式的标志。这些标志可以传递给函数
regex_search
或regex_match
或是类smatch
的format
成员,例如format_no_copy
是类型match_flag_type
的值,定义在命名空间std::regex_constants
中。
匹配标志(定义在regex_constants::mat_flag_type
中)
match_default | 等价于format_default |
match_not_bol | 不将首字符作为行首处理 |
match_not_eol | 不将尾字符作为行尾处理 |
match_not_bow | 不将首字符作为单词首处理 |
match_not_eow | 不将尾字符作为单词尾处理 |
match_any | 如果存在多于一个匹配,则可返回任意一个匹配 |
match_not_null | 不匹配任何空序列 |
match_continuous | 匹配必须从输入的首字符开始 |
match_prev_avail | 输入序列包含第一个匹配之前的内容 |
format_default | 用ECMAScript规则替换字符串 |
format_sed | 用POSIX sed规则替换字符串 |
format_no_copy | 不输出输入序列中未匹配的部分 |
format_first_only | 只替换子表达式的第一次出现 |
参考书籍: C++ Primer 5 中文版
相关文章:
C++正则表达式基础
文章目录1. 查找第一个匹配的2. 查找所有结果3. 打印匹配结果的上下文4. 使用子表达式5. 查找并替换注意: .(点)在括号中没有特殊含义,无需转义用\转义。 1. 查找第一个匹配的 #include <iostream> #include <regex>using names…...

如何在网络安全中使用人工智能并避免受困于此
人工智能在网络安全中的应用正在迅速增长,并对威胁检测、事件响应、欺诈检测和漏洞管理产生了重大影响。根据Juniper Research的一份报告,预计到2023年,使用人工智能进行欺诈检测和预防将为企业每年节省110亿美元。但是,如何将人工…...

生态 | 人大金仓与超聚变的多个产品完成兼容认证
近日,人大金仓与超聚变数字技术有限公司(简称“超聚变”)完成了多款产品的兼容互认测试。测试表明,人大金仓KingbaseES V8数据库与超聚变服务器操作系统FusionOS、超聚变FusionOne基础设施完全兼容,人大金仓异构数据同…...

4自由度串联机械臂按颜色分拣物品功能的实现
1. 功能说明 本实验要实现的功能是:将黑、白两种颜色的工件分别放置在传感器上时,机械臂会根据检测到的颜色,将工件搬运至写有相应颜色字样区域。 2. 使用样机 本实验使用的样机为4自由度串联机械臂。 3. 运动功能实现 3.1 电子硬件 在这个…...

玩转结构体---【C语言】
⛩️博主主页:威化小餅干📝系列专栏:【C语言】藏宝图🎏 ✨绳锯⽊断,⽔滴⽯穿!一个编程爱好者的学习记录!✨目录结构体类型的声明结构体成员访问结构体传参前言我们是否有想过,为什么会有结构体呢…...

c语言指针怎么理解 第二部分
第四,指针有啥用。 比方说,我们有个函数,如下: int add(int x){ return (x1); //把输入的值加1并返回结果。 } 好了,应用的时候是这样的: { int a1; aadd(a); //add函数返回的是a1 //现在 a等于…...

GC简介和监控调优
GC简介: GC(Garbage Collection)是java中的垃圾回收机制,是Java与C/C的主要区别之一,在使用JAVA的时候,一般不需要专门编写内存回收和垃圾清理代 码。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。 什么…...
Understanding The Linux Kernel --- Part2 Memory Addressing
内存寻址 操作系统自身不必完全了解物理内存,如今的微处理器包含的硬件线路使内存管理既高效又健壮,所以编程错误就不会对该程序之外的内存产生非法访问 x86如何进行芯片级内存寻址Linux如何利用寻址硬件 x86 三种不同的地址术语 逻辑地址 逻辑地址…...

前后端分页查询好大的一个坑(已解决)
前言:如果你在做前后端的分页查询,找不到错误,请你来看看是否是和我一样的情况?情况:做了一个前后盾UI的项目,有一个页面是查询系统日志,要进行分页查询;第一页的:第5页的…...
Python批量执行读取ini文件和写入ini文件时,性能比较低怎么办,给出解决方案和源码
Python批量执行读取ini文件和写入ini文件时,性能比较低怎么办,给出解决方案和源码 解决方案: 使用ConfigParser的缓存机制,可以避免频繁读取ini文件造成的性能问题。 将ini文件转换为json格式,使用json库进行读写操作…...
微机原理与接口技术 汇编语言程序设计DOS常用命令
OS(磁盘操作系统)命令,是DOS操作系统的命令,是一种面向磁盘的操作命令,主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。 使用技巧 DOS命令不区分大小写,比如C盘的Program Files&…...

4.ffmpeg命令转码规则、过滤器介绍、手动流map选项
在上章我们学习了ffmpeg命令行帮助以及选项查找 本章我们来深入学习ffmpeg命令转码规则、过滤器介绍、手动流map选项 参考链接: 1.ffmpeg命令行转码流程 ffmpeg命令行转码流程如下图所示: 对应中文则是: 步骤如下所示: ffmpeg调用libavformat库(包含解复用器)来读取输入文件…...

【python】标准库详解
注:最后有面试挑战,看看自己掌握了吗 文章目录Standard Library简介python内置对象如何安装发布第三方模块10最好用的模块汇总包的本质datetime模块案例Math模块random模块OS模块sys模块time模块总结自定义模块标准库模块用help查看time模块常用第三方库…...

Golang Map原理(底层结构、查找/新增/删除、扩缩容)
参考: 解剖Go语言map底层实现Go语言核心手册-3.字典 一、Go Map底层结构: Go map的底层实现是一个哈希表(数组 链表),使用拉链法消除哈希冲突,因此实现map的过程实际上就是实现哈希表的过程。 先来看下…...

Java_数组
数组 1.概念 需求:现在需要统计软件技术1班47名同学的成绩情况,例如计算平均成绩、最高成绩等。如果只能使用变量的话,那么需要定义100个变量,这样就比较复杂了。这时我们就可以使用数组来记住这47名同学的成绩,然…...
list与vector的区别
相信大家已经学过list与vector,关于它们的不同,我做了一些总结,如下表: vector list底层结构动态顺序表,一段连续的空间带头结点的双向链表随机访问支持随机访问,访问某个元素的效率…...

【C++、数据结构】位图、布隆过滤器、哈希切割(哈希思想的应用)
文章目录📖 前言1. 位图1.1 海量数据处理思路分析:1.2 位图的具体实现:1.3 用位图解决问题:应用一:应用二:应用三:2. 布隆过滤器2.1 布隆过滤器的概念:2.2 布隆过滤器的测试…...

计算机网络安全基础知识3:网站漏洞,安装phpstudy,安装靶场漏洞DVWA,搭建一个网站
计算机网络安全基础知识3:网站漏洞,安装phpstudy,安装靶场漏洞DVWA,搭建一个网站 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测…...

大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)
6 最短路径 最短路径,对于图来说,是两顶点之间经过的边数最少的路径;对于网来说,是指两顶点之间经过的边上权值之和最小的路径。路径上第一个顶点为源点,最后一个顶点是终点。 6.1 迪杰斯特拉(Dijkstra&am…...
2023年全国最新食品安全管理员精选真题及答案10
百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 91.实施日常检查,如果违反关键项的,应当即作出如…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...