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

 一、前言

  之前在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;
}


  运行效果如下图所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值