关于正则表达式的语法和字符含义,网上已经有很不错的博客教学,我当初参考的是

读懂正则表达式就这么简单 - Zery - 博客(http://www.cnblogs.com/zery/p/3438845.html

正则表达式 – 语法 | 菜鸟教程  (http://www.runoob.com/regexp/regexp-syntax.html)

我在这里重点说明如何使用C++的regex库完成正则匹配,正则查找,正则替换三种操作

  1. 首先是头文件

     #include<regex>
    using namespace std;
  2. 正则表达式声明
    string str("\\d{4}");
    regex pattern(str,regex::icase);

    注意与一般应用正则表达式不同,这里的转义符号要用“\\”

  3. 匹配结果存放变量声明
         //第一种存储方式
    match_results<string::const_iterator> result;
    //第二种存储方式
    smatch result;

    这两个类都可以存储匹配得到的结果,建议使用第二种,比较方便

  4. 数据准备
         //文本数据
    string str="1994 is my birth year";
  5. 正则操作
    • 正则匹配

           //正则匹配
      string regex_str2("(\\d{4}).*");
      regex pattern2(regex_str2,regex::icase); if(regex_match(str,result,pattern2)){
      cout<<result[]<<endl;
      cout<<result[]<<endl;
      }

      注意正则匹配的运算规则是先检查正则表达式是否与文本数据一致,只有在一致的条件下才会将匹配结果送入result中。例如将正则表达式改为("\\d{4}"),返回值为FALSE,result中根本没有结果。下图是运行结果。我们从中看出result[0]是完整的文本,result[1]是第一个分组匹配的数据。如果正则表达式有n个分组,result的size也就是n+1个

       

    • 正则查找

           //文本数据
      string str="1994 is my birth year";
      //正则表达式
      string regex_str("\\d{4}");
      regex pattern1(regex_str,regex::icase); //迭代器声明
      string::const_iterator iter = str.begin();
      string::const_iterator iterEnd= str.end();
      string temp;
      //正则查找
      while (std::regex_search(iter,iterEnd,result,pattern1))
      {
      temp=result[];
      cout<<temp<<endl;
      iter = result[].second; //更新搜索起始位置
      }

      首先声明迭代器,在用while循环查找,每一次查找只会匹配一个结果

    • 正则替换
      //正则替换
      std::regex reg1("\\d{4}");
      string t("");
      str = regex_replace(str,reg1,t); //trim_left
      cout<<str<<endl;

      在str查找匹配的文本,并用t中的数据替换。经检验,这个函数会遍历整个文本变量,也就是文本变量中所有符合正则表达式的数据都会被替换

以上就是我的经验总结,希望能帮到你。

最后附上所有代码

 int main(){

     //第一种存储方式
//match_results<string::const_iterator> result;
//第二种存储方式
smatch result; //文本数据
string str="1994 is my birth year 1994";
//正则表达式
string regex_str("\\d{4}");
regex pattern1(regex_str,regex::icase); //迭代器声明
string::const_iterator iter = str.begin();
string::const_iterator iterEnd= str.end();
string temp;
//正则查找
while (std::regex_search(iter,iterEnd,result,pattern1))
{
temp=result[];
cout<<temp<<endl;
iter = result[].second; //更新搜索起始位置
} //正则匹配
string regex_str2("(\\d{4}).*");
regex pattern2(regex_str2,regex::icase); if(regex_match(str,result,pattern2)){
cout<<result[]<<endl;
cout<<result[]<<endl;
} //正则替换
std::regex reg1("\\d{4}");
string t("");
str = regex_replace(str,reg1,t); //trim_left
cout<<str<<endl; return ;
}

C++ regex库的三种正则表达式操作的更多相关文章

  1. php三种方式操作mysql数据库

    php可以通过三种方式操作数据库,分别用mysql扩展库,mysqli扩展库,和mysqli的预处理模式分别举案例加以说明 1.通过mysql方式操作数据库 工具类核心代码: <?php cla ...

  2. C++中三种正则表达式比较(C regex,C ++regex,boost regex)

    工作需要用到C++中的正则表达式,以下三种正则可供参考 1,C regex #include <regex.h> #include <iostream> #include &l ...

  3. EF三种数据库操作模型比较

    https://blog.csdn.net/xiongmeiqin/article/details/80196089 EF 中 Code First 的数据迁移以及创建视图 写在前面: EF 中 Co ...

  4. Android 接入 OpenCV库的三种方式

           OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少 ...

  5. 浅谈SQL Server中的三种物理连接操作

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

  6. Swift - as、as!、as?三种类型转换操作使用一览

    as.as!.as? 这三种类型转换操作符的异同,以及各自的使用场景.   1,as使用场合 (1)从派生类转换为基类,向上转型(upcasts) 1 2 3 4 class Animal {} cl ...

  7. SQL Server中的三种物理连接操作

    来源:https://msdn.microsoft.com/zh-cn/library/dn144699.aspx 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Out ...

  8. 浅谈SQL Server中的三种物理连接操作(HASH JOIN MERGE JOIN NESTED LOOP)

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

  9. 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

随机推荐

  1. hadoop2.0的数据副本存放策略

    在hadoop2.0中,datanode数据副本存放磁盘选择策略有两种方式: 第一种是沿用hadoop1.0的磁盘目录轮询方式,实现类:RoundRobinVolumeChoosingPolicy.j ...

  2. openEntityForm时候如何给关于(regardingobjectid)类型查找字段赋值?

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复264或者20170924可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  3. [原创]MinHook测试与分析(x64下 E9,EB,CALL指令测试,且逆推测试微软热补丁)

    依稀记得第一次接触Hook的概念是在周伟民先生的书中-><<多任务下的数据结构与算法>>,当时觉得Hook很奇妙,有机会要学习到,正好近段日子找来了MiniHook,就一 ...

  4. js如何判断一个对象为空

    今天碰到一个问题如何判断一个对象为空? 总结的方法如下: 1.使用jquery自带的$.isEmptyObject()函数. var data={}; console.log($.isEmptyObj ...

  5. 【转】 IntelliJ IDEA像Eclipse一样打开多个项目

    http://blog.csdn.net/zht666/article/details/47831893 我们做项目实际中经常会遇到这样的情况,创建一个common项目(Maven项目)作为公用项目, ...

  6. 糖果大战 hdu1204

    糖果大战 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. 1042 数字0-9的数量 1050 循环数组最大子段和 1062 序列中最大的数 1067 Bash游戏 V2 1092 回文字符串

    1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数.   比如 10-19,1出现11次 ...

  8. Log4net日志使用教程-控制台、文本、数据库三种记录方式

    一.log4net简介: 1. Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的 ...

  9. 选择排序的3种语言实现方法(C java python)

    1.选择排序的思路是:遍历数组,第一遍找出所有成员的最小值,放到数组下标为0的位置,第二遍从剩余内容中,再次找出最小值,放到数组下标为1的位置,以此类推,遍历完成所有的数组内容,最后结果就是:数组是按 ...

  10. RN 常见问题

    React/RCTBridgeModule.h not found #import <React/RCTBridgeModule.h> 全部替换为 #import "RCTBri ...