C++中使用正规表达式操作字符串

来源:互联网 发布:淘宝买药货到付款骗局 编辑:程序博客网 时间:2024/05/22 07:52

 一、前言

  之前在C++中使用正规表达式是比较头痛的问题,要么需要引用第三方库,要么需要自己实现匹配过程。虽然使用第三方的库确实可行,但对程序的移植带来一定的困难,有时不得不带上笨重的Boost库或使用为Perl开发的C语言库,新的C++标准中加入了对正规表达式的支持,这的确是大快人心,因为在字符串处理中或多或少使用正规表达式能达到事半功倍的效果,且程序的健壮性得到很好的保持。下面就使用C++的正规表达式写个Hello World等级的程序,旨在抛砖引玉。

二、正规表示支持的C++标准实现

  STL使用固然简单,但要查看源代码实现确实是A piece of shit,铺天盖地的模板让人找不着北。废话少说,简要介绍下STL中正规表达式部分。

  引入的头文件名为regex,其中定义的几个几个模板类,重要的如basic_regex,match_results,regex_error等,其余的几个类为常量定义或个性化模板,提供的方法有regex_search,regex_match,regex_replace,regex_swap,这些就是最期望看到的函数,从函数名称就能看出大概实现什么功能。其中最后一个比较少用外,其余三个是必不可少的选择。

  头文件中还定义了数目较多的常量和个性化模板类型,可根据需要进行选取,避免的自己写大量typedef语句,具体内容可以参看一份STL的头文件即可。

三、Hello World程序

  本示例程序使用了查找、匹配和替换三个函数,使用交换函数也相对简单,如法泡制即可。在替换函数中需要说明的是Format参数支持Look Back方式的替换,即根据正规表达式可以取到子表达式匹配的内容用于执行替换,这部分也是正规表达式很常用的。

  下面是源程序代码:

#include <string>#include <regex>#include <iostream>using namespace std;int main(int argc, char *argv[]){string s("I went to Wikipedia tonight to look up Steve Jobs’ birthday to write this post.");regex rx("W[a-z]+a");cmatch mr;if(regex_search(s.c_str(),mr,rx)){cout<<"Found the words:";for_each(mr.begin(),mr.end(),[](string si){cout<<si<<" ";});cout<<endl;}cout<<endl;string fmt("bbs");s = regex_replace(s,rx,fmt);cout<<"Result string is :"<<s<<endl;cout<<endl;rx.assign("[A-Za-z ’\\.]+");if(regex_match(s,rx)){cout<<"The string is matched"<<endl;}else{cout<<"The string is not matched"<<endl;}cout<<endl;return 0;}


  运行效果如下图所示:

原创粉丝点击