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

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

  1. c++11新特性_c++11新特性(四)

    4.lambda.bind.function 4.1.直接lambda表达式 lamda表达式不仅仅是一个语法新特性,对于没有用过java或C#lamda表达式读者,C++11的lamda表达式在一定 ...

  2. this指针_c++11新特性之智能指针

    很多人谈到c++,说它特别难,可能有一部分就是因为c++的内存管理吧,不像java那样有虚拟机动态的管理内存,在程序运行过程中可能就会出现内存泄漏,然而这种问题其实都可以通过c++11引入的智能指针来 ...

  3. 正则表达式不包含某个字符串_JMeter必知必会系列(18) JMeter正则表达式提取器疑难分析...

    JMeter正则表达式提取器疑难分析 前沿 JMeter正则表达式提取器的配置项中, Regular Expression, Template与 Match No.这三个配置项是比较难以理解的,本文针 ...

  4. Jmeter之正则表达式提取器(一)

    Jmeter之正则表达式提取器 前言 接口间的关联参数数据需要传递参数值.故可通过 正则表达式提取器 来处理. 下面我们一起来学习如何使用 正则表达式提取器 获取接口返回的值 正则表达式提取器的使用 ...

  5. JMeter关联:JMeter正则表达式提取器与JSON提取器

    JMeter使用正则表达式和JSON提取器实现关联 前言 1 关联的释义与示例 2 常用正则表达式详解 3 正则表达式提取器 3.1 参数详解 3.2 使用示例 4 JSON提取器 4.1 参数详解 ...

  6. C++11新特性(原封不动转载待查)

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  7. COSMIC的后端学习之路——2.1 C++11新特性(1)

    2.1 C++11新特性(1) 知识树 1.智能指针 (1)std::shared_ptr:共享的智能指针 ①初始化 ②获取原始指针 ③指定删除器(自定义删除对象) ④一些错误用法 (2)std::u ...

  8. Jmeter如何将上一个请求的结果作为下一个请求的参数——使用正则表达式提取器转载...

    正则表达式提取器是一个后置处理器,作用是在请求完成后,从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用,下面我们就来做一个简单的例子吧 1.首先在线程组下添加两个HTTP请求, 2.添加好 ...

  9. JMeter学习-009-JMeter 后置处理器实例之 - 正则表达式提取器(二)多参数获取

    前文简述了通过后置处理器 - 正则表达式提取器 获取 HTTP请求 响应结果中的特定数据,未看过的亲,敬请参阅 JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一). ...

最新文章

  1. sqlrelay mysql_数据库连接池SQL Relay安装使用-Java架构师必看
  2. ASP.NET Web API 过滤器创建、执行过程(二)
  3. 2010 eWEEK 年度产品
  4. 深度洞见|从起源到应用,一文详解营销界爆火的 CDP
  5. 2021年第十二届蓝桥杯 - 省赛 - C/C++大学C组 - D.相乘
  6. 百度地图api的密钥申请地址
  7. 《零基础看得懂的C语言入门教程 》——(五)C语言的变量、常量及运算
  8. java超时结束程序_java本机进程超时
  9. python包路径有几个_python的搜索路径与包(package)
  10. Linux下VNCSERVER的使用介绍
  11. 计算机组成原理—DRAM的刷新
  12. 计算机高一教案,《计算机系统的基本组成》高一信息技术课教案
  13. 10 个用于 Linux 的开源轻量级 Web 浏览器
  14. dw添加下拉菜单_怎样用Dreamweaver制作导航栏下拉菜单
  15. 【数学模拟卷总结】2022李林四套卷数学二第一套
  16. 虚拟机Linux - HTTP request sent, awaiting response... 404 Not Found
  17. IKEA宜家社会责任验厂标准
  18. 大数据必学Java基础(一):Java体系结构、特性和优势
  19. String“+”与StringBuffer/StringBuilder 对象的append方法
  20. Moore FSM和Mealy FSM的区别

热门文章

  1. docker php nginx,使用docker快速搭建nginx+php环境
  2. python实现etl_为什么选择R而不是Python做ETL
  3. .net pdf转图片_pdf2image类库实现批量pdf转图片
  4. Python批量删除错误图片、修改文件名以及删除重复图片
  5. 9.数据库中的子查询
  6. python中僵尸进程
  7. Master HA源码解析
  8. 机器学习算法--ALS
  9. 论文浅尝 | 低资源文本风格迁移数据集
  10. Day03『NLP打卡营』实践课3:使用预训练模型实现快递单信息抽取