正则表达式提取器_C++11新特性7 - 正则表达式
C++11 新增了正则表达式的标准库支持,本文简介 C++ 正则表达式的使用
在 C++ 中使用正则表达式,和其它语言差别不大
int main() {regex e("abc*");bool m = regex_search("abccc", e);// 输出 yescout << (m ? "yes" : "no") << endl;
}
C++11 自带了 6 种正则表达式语法的支持
- ECMAScript
- basic
- extended
- awk
- grep
- 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 1youtu.beC++ 11 Library: Regular Expression 2 -- Submatchyoutu.beC++ 11 Library: Regular Expression 3 -- Iteratorsyoutu.be
正则表达式提取器_C++11新特性7 - 正则表达式相关推荐
- c++11新特性_c++11新特性(四)
4.lambda.bind.function 4.1.直接lambda表达式 lamda表达式不仅仅是一个语法新特性,对于没有用过java或C#lamda表达式读者,C++11的lamda表达式在一定 ...
- this指针_c++11新特性之智能指针
很多人谈到c++,说它特别难,可能有一部分就是因为c++的内存管理吧,不像java那样有虚拟机动态的管理内存,在程序运行过程中可能就会出现内存泄漏,然而这种问题其实都可以通过c++11引入的智能指针来 ...
- 正则表达式不包含某个字符串_JMeter必知必会系列(18) JMeter正则表达式提取器疑难分析...
JMeter正则表达式提取器疑难分析 前沿 JMeter正则表达式提取器的配置项中, Regular Expression, Template与 Match No.这三个配置项是比较难以理解的,本文针 ...
- Jmeter之正则表达式提取器(一)
Jmeter之正则表达式提取器 前言 接口间的关联参数数据需要传递参数值.故可通过 正则表达式提取器 来处理. 下面我们一起来学习如何使用 正则表达式提取器 获取接口返回的值 正则表达式提取器的使用 ...
- JMeter关联:JMeter正则表达式提取器与JSON提取器
JMeter使用正则表达式和JSON提取器实现关联 前言 1 关联的释义与示例 2 常用正则表达式详解 3 正则表达式提取器 3.1 参数详解 3.2 使用示例 4 JSON提取器 4.1 参数详解 ...
- C++11新特性(原封不动转载待查)
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- COSMIC的后端学习之路——2.1 C++11新特性(1)
2.1 C++11新特性(1) 知识树 1.智能指针 (1)std::shared_ptr:共享的智能指针 ①初始化 ②获取原始指针 ③指定删除器(自定义删除对象) ④一些错误用法 (2)std::u ...
- Jmeter如何将上一个请求的结果作为下一个请求的参数——使用正则表达式提取器转载...
正则表达式提取器是一个后置处理器,作用是在请求完成后,从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用,下面我们就来做一个简单的例子吧 1.首先在线程组下添加两个HTTP请求, 2.添加好 ...
- JMeter学习-009-JMeter 后置处理器实例之 - 正则表达式提取器(二)多参数获取
前文简述了通过后置处理器 - 正则表达式提取器 获取 HTTP请求 响应结果中的特定数据,未看过的亲,敬请参阅 JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一). ...
最新文章
- sqlrelay mysql_数据库连接池SQL Relay安装使用-Java架构师必看
- ASP.NET Web API 过滤器创建、执行过程(二)
- 2010 eWEEK 年度产品
- 深度洞见|从起源到应用,一文详解营销界爆火的 CDP
- 2021年第十二届蓝桥杯 - 省赛 - C/C++大学C组 - D.相乘
- 百度地图api的密钥申请地址
- 《零基础看得懂的C语言入门教程 》——(五)C语言的变量、常量及运算
- java超时结束程序_java本机进程超时
- python包路径有几个_python的搜索路径与包(package)
- Linux下VNCSERVER的使用介绍
- 计算机组成原理—DRAM的刷新
- 计算机高一教案,《计算机系统的基本组成》高一信息技术课教案
- 10 个用于 Linux 的开源轻量级 Web 浏览器
- dw添加下拉菜单_怎样用Dreamweaver制作导航栏下拉菜单
- 【数学模拟卷总结】2022李林四套卷数学二第一套
- 虚拟机Linux - HTTP request sent, awaiting response... 404 Not Found
- IKEA宜家社会责任验厂标准
- 大数据必学Java基础(一):Java体系结构、特性和优势
- String“+”与StringBuffer/StringBuilder 对象的append方法
- Moore FSM和Mealy FSM的区别