概要

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)的更多相关文章

  1. 理解C++11正则表达式(2)

    今天有幸(2016/3/19)在上海参加了C++交流会,见到了梦寐已久想见的台湾C++大神老师侯捷,心情十分的激动.侯老师对C++理解的深刻,让人叹为观止.以为他教学的严谨,说话方式娓娓道来,听着非常 ...

  2. C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)

    因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...

  3. c++11 正则表达式基本使用

    c++ 11 正则表达式 常用的方法 regex_match regex_search regex_replace 等. regex_match 要求正则表达式必须与模式串完全匹配,例如: strin ...

  4. C++11 | 正则表达式(4)

    C++11还支持正则表达式里的子表达式(也叫分组),用sub_match这个类就行了. 举个简单的例子,比如有个字符串"/id:12345/ts:987697413/user:678254& ...

  5. 深入理解C++11【5】

    [深入理解C++11[5]] 1.原子操作与C++11原子类型 C++98 中的原子操作.mutex.pthread: #include<pthread.h> #include <i ...

  6. 深入理解C++11【4】

    [深入理解C++11[4]] 1.基于范围的 for 循环 C++98 中需要告诉编译器循环体界面范围.如for,或stl 中的for_each: int main() { ] = { , , , , ...

  7. 深入理解C++11【3】

    [深入理解C++11[3]] 1.POD类型 Plain Old Data. Plain 表示 了POD是个普通的类型.C++11将POD划分为两个基本概念的合集: 1)平凡的(trivial) 2) ...

  8. 深入理解C++11【2】

    [深入理解C++11[2]] 1.继承构造函数. 当基类拥有多个构造函数的时候,子类不得不一一实现. C++98 可以使用 using 来使用基类的成员函数. #include < iostre ...

  9. 深入理解C++11

    [深入理解C++11] 1.很多 现实 的 编译器 都 支持 C99 标准 中的__ func__ 预定 义 标识符 功能, 其 基本 功能 就是 返回 所在 函数 的 名字. 编译器 会 隐式 地 ...

随机推荐

  1. [USACO1.2.2]方块转换 Transformations

    P1205 [USACO1.2]方块转换 Transformations 标签 搜索/枚举 USACO 题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方 ...

  2. JavaWeb网上商城的反思

    不知道从什么时候起,我爱上了写博客,对之前学得的只是进行反思.写了几天课程设计,代码量量8.9千左右. 然后下面文字是我在博客上复制过来的,说得很详细 MVC(Model View Controlle ...

  3. BufferedReader、FileReader、FileInputStream的区别

    一.BufferReader BufferedReader   由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合,BufferedReade ...

  4. 解决 nginx 返回数据不完整的方法

    通过PHP请求接口时发现接口的内容输出没有完整的返回整个数据,早上只修改了nginx api_metrics插件里的计算response大小的代码,观察日志发现一条: 2012/08/28 02:13 ...

  5. [转]left join,right join,inner join区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  6. (转载)Delphi StringGrid常用属性和常用操作

    Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...

  7. Linux文件3个时间点(access time,modify time,change time)

    在Linux中使用stat命令来查看文件的详细信息. 如图所示,会出现3个类型的时间,分别是Access,Modify,Change. access time:表示最后一次访问(仅仅是访问,没有改动) ...

  8. STM32系列命名规则

    转自:STM32系列命名规则 STM32 F 103 C 6 T 7 xxx 1 2 3 4 5 6 7 8 第1部分:产品系列名,固定为STM32 第2部分:产品类型:F表示这是Flash产品,目前 ...

  9. 在ubuntu12.0.4上搭建samba服务器以实现文件共享

    在安装之前samba服务器之前,先进行以下配置和测试. <壹> 准备工作 一.NAT联网方式 (1)硬件连接 无需网线,无需路由器 (2)虚拟机选择NAT连接方式 (3)测试网络通不通 在 ...

  10. Length of Last Word | Leetcode

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...