正则表达式提取器_C++11新特性7 - 正则表达式

11b1fa943d08b39403cf562282e50090.png

C++11 新增了正则表达式的标准库支持,本文简介 C++ 正则表达式的使用

在 C++ 中使用正则表达式,和其它语言差别不大

int main() {regex e("abc*");bool m = regex_search("abccc", e);// 输出 yescout << (m ? "yes" : "no") << endl;
}

C++11 自带了 6 种正则表达式语法的支持

  1. ECMAScript
  2. basic
  3. extended
  4. awk
  5. grep
  6. egrep

C++11 默认使用 ECMAScript 语法,这也是 6 种语法中最强大的,假如想使用其他 5 种语法,只需在声明 regex 对象时指定即可

regex e("^a.", regex_constants::grep);

假如我们不仅仅想知道一个正则表达式是否匹配一个字符串,我们还想要提取出匹配的部分,例如我们需要从邮箱中提取用户名和网址,就需要用到 match_results

int main() {string str("Email a@bc.com abc");// 等同于 match_results<string>smatch m; regex e("([[:w:]]+)@([[:w:]]+.com)");bool found = regex_search(str, m, e);// m.size=3, 存储了 3 个 resultcout << "m.size=" << m.size() << endl;/* 迭代 match_results, 输出m[0]=a@bc.com (整个匹配)m[1]=a (第1个group)m[2]=bc.com (第2个group)*/for (int n=0; n<m.size(); n++){cout << "m[" << n << "]=" << m[n].str() << endl;//等价写法 m.str(n), *(m.begin()+n) }// m.prefix=Emailcout << "m.prefix=" << m.prefix().str() << endl;// m.suffix= is minecout << "m.suffix=" << m.suffix().str() << endl;
}

假如我们想要匹配的字符串中,有多个子串都可以匹配正则表达式,并且我们想把这些子串全部找出来,例如一个字符串中包含多个邮箱地址,那么就需要用到 regex_iterator

int main() {string str("a@bc.com, d@ef.com, aa@b.com");regex e("([[:w:]]+)@([[:w:]]+.com)");sregex_iterator pos(str.cbegin(), str.cend(), e); // 定义 regex_iteraror// C++惯例: 默认构造的迭代器表示序列结束sregex_iterator end;/*
email=a@bc.com, user=a, domain=bc.com
email=d@ef.com, user=d, domain=ef.com
email=aa@bb.com, user=aa, domain=b.com
*/for (; pos!=end; pos++) {cout << "email=" << pos->str(0) << ", user=" << pos->str(1) << ", domain=" << pos->str(2) << endl;}
}

如上我们可以看到,regex_iterator 其实就是迭代字符串中所有正则表达式匹配的 match_results

除此之外,C++ 还提供了另一种跌到器, regex_token_iterator。不同的是,regex_token_iterator 迭代的是所有正则表达式匹配中的指定子表达式,或迭代未匹配的子字符串

int main() {string str("a@bc.com, d@ef.com, aa@bb.com");regex e("([[:w:]]+)@([[:w:]]+.com)");sregex_token_iterator pos(str.cbegin(), str.cend(), e); // 定义regex_token_iteratorsregex_token_iterator end; //序列结束/*Matched: a@bc.comMatched: d@ef.comMatched: aa@bb.com*/for (; pos!=end; pos++) {cout << "Matched:  " << *pos << endl;}
}

我们可以修改 pos 的定义,使它每次迭代 match_results 的第 2 个 group

// 第 4 个参数表示第几个 group
sregex_token_iterator pos(str.cbegin(), str.cend(), e, 2
);

值得注意的是,如果我们把这里的参数设为 -1,则迭代字符串中所有不匹配正则表达式的部分,相当于用正则表达式切割字符串

int main() {string str("a bb   cd");regex e("s+"); // 匹配空格// 迭代不匹配正则表达式的部分sregex_token_iterator pos(str.cbegin(), str.cend(), e, -1);sregex_token_iterator end;/*Matched: aMatched: bbMatched: cd*/for (; pos!=end; pos++) {cout << "Matched: " << *pos << endl;}
}

正则表达式还有一个常用的场景——字符串替换。C++ 中我们可以使用 regex_replace

int main() {string str("a@bc.com, d@ef.com, aa@bb.com");regex e("([[:w:]]+)@([[:w:]]+.com)");cout << regex_replace(str, e, "$1 is on $2");
}

输出为

a is on bc.com, d is on ef.com, aa is on bb.com

本文主要翻译自 Bo Qian 的 YouTube 视频

C++ 11 Library: Regular Expression 1​youtu.beC++ 11 Library: Regular Expression 2 -- Submatch​youtu.beC++ 11 Library: Regular Expression 3 -- Iterators​youtu.be

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

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

相关文章

智慧城市建设必须认真对待的几个问题(一):IPV6作为地址的问题

全文共计4384字&#xff0c;预计阅读时间9分钟来源 | 数据观&#xff08;转载请注明来源&#xff09;作者 | 陆宝华 李晋 张永红 李学良编辑 | 蒲蒲引言智慧城市已经热炒几年了&#xff0c;目前还在升温&#xff0c;并且一些做国际联网应用的大企业提出了“城市大脑”的概念。当…

linux open 头文件_linux下通过共享内存和mmap实现进程间通讯

前言最近在学习GNU/Linux内核&#xff0c;看到mmap的时候书上说&#xff1a;mmap/munmap接口函数是用户最常用的两个系统调用接口&#xff0c;无论是在用户程序中分配内存、读写大文件、链接动态库文件&#xff0c;还是多进程间共享内存&#xff0c;都可以看到mmap/munmap的身影…

TinyML:下一轮人工智能革命

来源&#xff1a;AI前线作者&#xff1a;Matthew Stewart译者&#xff1a;盖磊策划&#xff1a;陈思人工智能的一个趋势是正快速从“云端”走向“边缘”。TinyML 是在海量的物联网设备端微控制器上实现的人工智能&#xff0c;有望在未来几年内&#xff0c;成为人工智能在工业领…

springboot导入项目依赖报错_最详细的 Spring Boot 多模块开发与排坑指南

来源于公众未读代码 &#xff0c;作者达西呀创建项目创建一个 SpringBoot 项目非常的简单&#xff0c;简单到这里根本不用再提。你可以在使用 IDEA 新建项目时直接选择 Spring Initlalize 创建一个 Spring Boot 项目&#xff0c;也可以使用 Spring 官方提供的 Spring Boot 项目…

图书管理系统html_结自主可控数字化硕果,同方鼎欣推进基于OFD技术的数字档案管理系统研发...

01浅谈建立自主可控版式格式的重要性说起版式文档&#xff0c;相信大家首先想到的就是Adobe公司推出的PDF&#xff0c;这种格式的电子文档&#xff0c;其效果不因软硬件环境变化而变化&#xff0c;在版面、字体、字号方面可以与纸质文件保持一致&#xff0c;这就是版式文档的重…

联结你与万物的8种元素

本文经授权转载自《原理》微信公众号你不仅由元素构成&#xff0c;你其实就是元素。不同元素的原子在你的身体里&#xff0c;它们随你而动&#xff0c;它们与你一同经历成功的狂喜&#xff0c;一同承受失败的悲痛&#xff0c;也一同走过平淡的日常。当你吃下食物时&#xff0c;…

Spring中的用到的设计模式大全

spring中常用的设计模式达到九种&#xff0c;我们举例说明&#xff1a; 第一种&#xff1a;简单工厂又叫做静态工厂方法&#xff08;StaticFactory Method&#xff09;模式&#xff0c;但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数&#xff…

crontab 日志_聊聊老板让我删除日志文件那些事儿

一、背景老板&#xff1a;小白&#xff0c;刚才咱们的机器告警磁盘空间不足了&#xff0c;你去定位一下原因。我&#xff1a;(......空间不足碍我屁事儿)好的&#xff0c;马上定位我&#xff1a;老板&#xff0c;太多N天前的日志文件占用了太多空间。 老板&#xff1a;你感觉你…

【专家观点】刘经南院士:北斗+5G为何能引领新基建?

来源&#xff1a;智能研究院日前&#xff0c;“第四届全球未来出行大会&#xff08;GFM2020&#xff09;”在德清召开。本次大会旨在探讨未来的城市、未来的出行、未来的汽车如何为居民提供更加经济、便捷、安全、科技友好的新出行方式。在论坛的演讲中&#xff0c;中国工程院院…

ae中心点重置工具_(精品)AE从小白到大神之路(七)-AE动画—动效常见的设计方法...

动画——动效常见的设计方法一&#xff0e;基础动画&#xff1a;1.通过物体本身的旋转/缩放/位移/不透明度等基本属性来做的一些动效属于最基础的动画效果。二&#xff0e;路径动画&#xff1a;&#xff08;1&#xff09;修剪路径动画&#xff08;前面系列案例——下载提示完成…

css 透明度_如何使用CSS实现精美视频片头制作

借助CSS所提供的动画效果&#xff0c;旋转效果除了能够制作动画及网页页面元素&#xff0c;如按钮之外&#xff0c;还可以使用CSS实现精美的动态片头的制作。本文主要介绍CSS与HTML实现精美的动画片头制作实例。如何使用CSS实现精美片头制作CSS动态片头设计实例本例设计使用烟雾…

重磅盘点:过去8年中深度学习最重要的想法

原文&#xff1a;Deep Learning’s Most Important Ideas[1]作者&#xff1a;Denny Britz&#xff08;ML 研究员&#xff0c;Google Brain 前成员&#xff09;译者&#xff1a;REN深度学习是一个瞬息万变的领域&#xff0c;层出不穷的论文和新思路可能会令人不知所措。即使是经…

ActiveMQ 发送和接收消息

一、添加 jar 包 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>5.11.2</version> </dependency> 二、消息传递的两种形式 1、点对点&#xff1a;发送的消息只能被一个消…

机器人 蓝buff 钩_机器人要在S赛登场了?Ming韩服练起来了,这是RNG黑科技?

随着S9全球总决赛日程的逼近&#xff0c;各大战队也纷纷结束了休假&#xff0c;投入到了紧张的训练之中。对于这次S9世界赛的版本&#xff0c;应该是上中野的版本&#xff0c;因为不少战士单带型上单得到了巨大加强&#xff0c;而且中路会有一些法师英雄回归&#xff0c;总体来…

java构造器_Java类加载的过程

阅读本文约需要8分钟 大家好&#xff0c;我是你们的导师&#xff0c;经常看我朋友圈的同学应该知道&#xff0c;我每天会在微信上给大家免费提供以下服务&#xff01;1、长期为你提供最优质的学习资源&#xff01;2、给你解决技术问题&#xff01;3、每天在朋友圈里分享优质的技…

再讲卷积的本质及物理意义,解释的真幽默!

来源&#xff1a;电子工程专辑编辑 ∑Gemini分三个部分来理解&#xff1a;1&#xff0e;信号的角度2&#xff0e;数学家的理解&#xff08;外行&#xff09;3&#xff0e;与多项式的关系>>>>卷积这个东东是“信号与系统”中论述系统对输入信号的响应而提出的。因为…

分区助手扩大c盘后自动修复_磁盘分区工具,这个好用;无论调整C盘还是系统迁移...

使用傲梅分区助手安全地对磁盘进行分区安全分区注意事项1.对于重要数据&#xff0c;最好习惯定期备份。 您可以使用免费备份软件- 傲梅轻松备份进行备份。2.当傲梅分区助手正在移动数据时&#xff0c;请不要轻易地结束过程或强制关闭程序。3.在分区过程中&#xff0c;请确保您的…

c语言转义字符_C语言啊中的转义符有什么含义?

其实所谓的换行符就是回车&#xff0c;在各类编程语言中换行符是很常见的&#xff0c;而转义字符是一种特殊的字符常量。转义字符以反斜线""开头&#xff0c;后跟一个或几个字符。转义字符具有特定的含义&#xff0c;不同于字符原有的意义&#xff0c;故称“转义”字…

强化学习到底是什么,它如何运作?

强化学习是一种行为学习模型&#xff0c;由算法提供数据分析反馈&#xff0c;引导用户逐步获取最佳结果。来源丨Towards Data Science作者丨Jair Ribeiro编译丨科技行者强化学习属于机器学习中的一个子集&#xff0c;它使代理能够理解在特定环境中执行特定操作的相应结果。目前…

hihocoder1457

http://hihocoder.com/problemset/problem/1457 找不重复子串的和 topo序搞一搞&#xff0c;用父亲更新儿子节点的val&#xff0c;记得乘上节点数 //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#…