概要

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. UVA 11991 Easy Problem from Rujia Liu?(vector map)

    Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, ...

  2. 基于ACE的定时器模板类

    ACETimerClockGenerator.h ClockGeneratorIF.h 在类中定义一个结构体,在结构体中定义一个函数. 在结构体中定义一个函数,这样做有什么好呢? TimerHandl ...

  3. 第一个wxWidgets程序

    wxWidgets的安装方法网上有一大堆,可以参照http://wiki.codeblocks.org/index.php?title=WxWindowsQuickRef 这里解压并编译 ,也可以参照 ...

  4. thinkphp 杂乱笔记(1)

    部署模式可用两个单入口表示前后台thinkphpUploadspublic Home(前台)Admin(后台)index.php(前台入口文件)admin.php(后台入口文件)上面两个项目目录 也可 ...

  5. mysqli 取出数据库中某表的表头和内容

    需求如题 取出数据库中某表的表头和内容,并显示该表的行数和列数 <?php //显示表内容的函数 function showTable($tableName){ //连接数据库 $mysqli= ...

  6. win7的IE11降到IE8

    我为什么要降低IE版本呢?...... 下载了抓包工具HttpWatch,下载地址http://pan.baidu.com/s/1kVhPMmj  版本如下: 用IE11打开抓包时流内没有内容,可能跟 ...

  7. PHP实现斐波那契数列非递归方法

    斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n ...

  8. centos下redis安装

    下载redis http://www.redis.cn/download.html 下载php的redis扩展 https://github.com/phpredis/phpredis#install ...

  9. jdk .tar.gz 包安装 inAction

    方法参考于http://blog.sina.com.cn/s/blog_81631744010137iy.html, 多谢博主分享,此处仅作为个人学习笔记. 首先将*.tar.gz解压 tar -xz ...

  10. Java多线程初学者指南(12):使用Synchronized块同步变量

    我们可以通过synchronized块来同步特定的静态或非静态方法.要想实现这种需求必须为这些特性的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传 ...