boost库之正则匹配

正则基础:正则匹配字符

  • *点号(.)可以匹配任意单个字符
  • *表示前面的字符可以重复任意多次(n>=0)
  • +表示前面的字符可以重复一次或多次(n>0)
  • ?表示前面的字符可以重复0次或1次
  • ^匹配行的开头
  • $匹配行的结尾
  • ()用于定义一个正则表达式的子元素
  • {}可以指定元素的重复次数,{n}重复n次,{n,}重复x>=n次,{n,m}重复n到m次
  • []用于定义字符集合
  • \用于转义字符
  • |表示逻辑或,匹配它两侧的元素之一

boost正则匹配库xpressive
使用头文件#include<boost/xpressive/xpressive_dynamic.hpp>

	#include<boost/xpressive/xpressive_dynamic.hpp>
	#include<iostream>
	using namespace std;
	int main()
	{
		//正则匹配身份证号识别
		//18位数 6位地区码 8位生日 4位数字或最后一位字母X
		//单独匹配则是 \d{6}  (1|2)\d{3}(0|1)\d[0-3]\d   \d{3}(\d|X)
		//C++11使用了源生字符 以R"xxx(...)xxx"表示,可以识别转义字符,有效字符为()里的字符,()两边的需对称
		using namespace boost::xpressive;
		cregex reg = cregex::compile(R"(\d{6}(1|2)\d{3}(0|1)\d[0-3]\d\d{3}(\d|X))",icase); //icase不区分大小写
		assert(regex_match("999555197001019999", reg));
		assert(regex_match("99955519700101999X", reg));
	
		string strTxt("readme.txt");
		sregex start_reg = sregex::compile("^re.*"); //匹配开头
		sregex end_reg = sregex::compile("^.*txt$"); //匹配结尾
		assert(regex_match(strTxt, start_reg));
		assert(regex_match(strTxt, end_reg));
	
	
		//regex_search是正则字符串查找,可以获得其匹配数,但是需注意其匹配数是根据正则表达式的子串来匹配的,而不是完全匹配
		//下面(llo wor)(.*)的匹配数是3,而(llo wor).*的匹配数是2
		string strFound = "hello world!";
		sregex found_reg = sregex::compile("(he)(.{3}) (.{5})!",icase);
		assert(regex_search(strFound, found_reg));
		sregex found_reg1 = sregex::compile("(llo wor)(.*)", icase);
		smatch count;            //若是cregex则使用cmatch
		regex_search(strFound, count, found_reg1);
		cout << count.size() << count[0] << count[1] << endl;
	
		char ctrFound[] = "there is power-suit item";
		cregex reg1 = cregex::compile("(power)-(.{4})",icase);
		cmatch what;
		regex_search(ctrFound, what, reg1);
		cout << what.size();
		cout << what[0]<<"----" << what[1] << "----"<< what[2] << endl;
	
		//正则替换regex_replace
		string strReplace = "readme.txt";
		sregex replace_reg1 = sregex::compile("(.*)(me)");
		sregex replace_reg2 = sregex::compile("(t)(.)(t)");
		cout << regex_replace(strReplace, replace_reg1, "replace") << endl;
		cout << regex_replace(strReplace,replace_reg1,"$1replace") << endl;   //$n表示匹配第几个子串
		cout << regex_replace(strReplace, replace_reg1, "$&$&") << endl;  //$&表示引用全匹配
		cout << regex_replace(strReplace, replace_reg2, "$1$3") << endl;  //匹配1,3子串替换
	
		//正则迭代器用法
		string strIter = "count1 count2 count3";
		sregex iter_reg = sregex::compile(R"(\w{5}\d)");
		sregex_iterator pos(strIter.begin(), strIter.end(), iter_reg);
		sregex_iterator end;
		for (;pos!=end;++pos)
		{
			cout << (*pos)[0] << endl;              //注意操作符优先级,operator*要括起来
		}
	
		//正则分词
		string strToken = "--token1-- --token2-- --token3--";
		sregex token_reg = sregex::compile("\\w+",icase);
		sregex_token_iterator posToken(strToken.begin(),strToken.end(),token_reg);  //查找所有符合的单词
		for(;posToken!=sregex_token_iterator();++posToken)
		{ 
			cout << *posToken<<endl;
		}
	
		char strToken1[] = "--token1-- --token2-- --token3--";
		cregex token_reg1 = cregex::compile(" ");
		cregex_token_iterator posToken1(strToken1,strToken1+strlen(strToken1),token_reg1,-1); //根据空格分割字符
		for (;posToken1!=cregex_token_iterator();++posToken1)
		{
			cout << *posToken1 << endl;
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值