理解c++11正则表达式 (1)
概要
C++11提出了正则表达式这个概念,只需在头文件中包含#include<regex>即可。我们可以完成:
- Match 将整个输入拿来比对匹配某个正则表达式
- Search 查找与正则表达式吻合的pattern
- Tokenize 根据被指定的正则表达式的切分器取得语汇单元,即切词
- Replace 简单的理解就是替换掉和正则表达式吻合的第一个子序列
正文
首先,我们看一下下面的代码:
regex reg1("<.*>.*</.*>");
bool found = regex_match("<tag>value</tag>",reg1);
out(found);
. 指得是除了 换行符 以外的所有字符。
*指的是“0次或者多次”。
通过regex_match()函数判断是否吻合上述的pattern(样式)。regex_match("<tag>value</tag>",reg1)将返回true。
regex reg2("<(.*)>.*</\\1>");
bool found = regex_match("<tag>value</tag>",reg2);
out(found);
(.*)定义了所谓的capture group 捕获组的概念,通过这个(.*),之后就可以通过\1来指代它了。我们可以采用另一种写法(raw string):
regex reg2(R("<(.*)>.*</\1>"));
这个方法允许准确的写出其内容。他的准确格式是R"delim()delim" delim指的是字符序列,不包含空格,括号,反斜线。
regex reg3("<\\(.*\\)>.*</\\1>",regex_constants::grep);
bool found = regex_match("<tag>value</tag>",reg3);
out(found);
第二个实参类似unix grep命令。必须用额外的反斜线将欲成为group的字符包起来。
bool found = regex_match("<tag>value</tag>","<(.*)>.*</\\1>"); //error
bool found = regex_match(string("<tag>value</tag>"),"<(.*)>.*</\\1>"); //error
bool found = regex_match("<tag>value</tag>", regex("<(.*)>.*</\\1>")); //right
从上面的例子可以看出,在regex_match函数里调用string是不够的,虽然有隐式转换,但是语句会报错。
最后是讨论regex_search()和regex_match()的唯一的区别:
regex_match():检验是否整个字符串列 和某个正则表达式吻合。
regex_search(): 检验部分是否吻合。
我们可以查看下面的例子:
regex_search(data,regex(pattern));
regex_match(data,regex("(.*|\n)* + pattern + (.*|\n)*"));
(.*|\n)* 指的是:任何数量 任何字符包括\n。 | 值的是 或。而上面的两个函数表达的意思是同一个。
小结
我们可以从上面的例子看出,两个函数只能进行true | false的查找?如果我想知道 我这个位置在哪儿?怎么办?那就需要介绍新版的regex_search()和regex_match()。
注:C++11学习笔记 转载请注明出处。
理解c++11正则表达式 (1)的更多相关文章
- 理解C++11正则表达式(2)
今天有幸(2016/3/19)在上海参加了C++交流会,见到了梦寐已久想见的台湾C++大神老师侯捷,心情十分的激动.侯老师对C++理解的深刻,让人叹为观止.以为他教学的严谨,说话方式娓娓道来,听着非常 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- c++11 正则表达式基本使用
c++ 11 正则表达式 常用的方法 regex_match regex_search regex_replace 等. regex_match 要求正则表达式必须与模式串完全匹配,例如: strin ...
- C++11 | 正则表达式(4)
C++11还支持正则表达式里的子表达式(也叫分组),用sub_match这个类就行了. 举个简单的例子,比如有个字符串"/id:12345/ts:987697413/user:678254& ...
- 深入理解C++11【5】
[深入理解C++11[5]] 1.原子操作与C++11原子类型 C++98 中的原子操作.mutex.pthread: #include<pthread.h> #include <i ...
- 深入理解C++11【4】
[深入理解C++11[4]] 1.基于范围的 for 循环 C++98 中需要告诉编译器循环体界面范围.如for,或stl 中的for_each: int main() { ] = { , , , , ...
- 深入理解C++11【3】
[深入理解C++11[3]] 1.POD类型 Plain Old Data. Plain 表示 了POD是个普通的类型.C++11将POD划分为两个基本概念的合集: 1)平凡的(trivial) 2) ...
- 深入理解C++11【2】
[深入理解C++11[2]] 1.继承构造函数. 当基类拥有多个构造函数的时候,子类不得不一一实现. C++98 可以使用 using 来使用基类的成员函数. #include < iostre ...
- 深入理解C++11
[深入理解C++11] 1.很多 现实 的 编译器 都 支持 C99 标准 中的__ func__ 预定 义 标识符 功能, 其 基本 功能 就是 返回 所在 函数 的 名字. 编译器 会 隐式 地 ...
随机推荐
- 查内网虚拟机映射的公网IP
1.访问ip138.com 2.curl ifconfig.me
- (hdu)5652 India and China Origins 二分+dfs
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5652 Problem Description A long time ago there ...
- Linux下Docker安装
1 在 CentOS 6.4 上安装 docker docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172). docker官方文档说要求 ...
- Android学习7--日志信息的使用
在代码的调试中,日志信息是必不可少的,关于日志信息的使用,接下来,小编简要的说明一下: 日志分为几种:Verbose:从字面上解释,verbose为冗长的,啰嗦的,所以verbose日志信息输出的内容 ...
- webbench
Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测 ...
- ES6笔记-字符串方法
字符串检索方法,indexOf(searchValue,fromIndex)//参数1必需,检索查询的字符串或者值,参数2选题,规定检索的起始位置,不设置默认从0开始 indexOf()方法返回检索字 ...
- ezSQL 数据库操作类
http://justinvincent.com 官网,一切尽在里面的下载帮助文件中,妙哉也!! ez_sql_core.php <?php /************************* ...
- DIV+CSS 网页布局之:三列布局
1.宽度自适应三列布局 三列布局的原理和两列布局的原理是一样的,只不过多了一列,只需给宽度自适应两列布局中间再加一列,然后重新计算三列的宽度,就实现了宽度自适应的三列布局. 同样的道理,更多列的布局, ...
- centos下redis安装
下载redis http://www.redis.cn/download.html 下载php的redis扩展 https://github.com/phpredis/phpredis#install ...
- RegexKitLite 使用详解
1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中. 2.工程中添加libicucore.dylib frameworks. 友情提醒:一般 ...