Chapter 18.正则表达式库regex

正则表达式

关于正则表达式就不多做介绍了,vs2010中就已经支持这个c++的新特性,使用时可加入头文件regex,同时其被加入了std命名空间

#include <regex>

下面就简单的介绍regex类的三个成员函数,同时对于regex迭代器的用法就不多说了,用到时再总结添加

1.regex_match
尝试匹配正则表达式的整个字符序列
/*
iter BidirectionalIterator
match_results match_results<const iter/const char*/string,Alloc>& match_results
regex const basic_regex<CharT,Traits>& regex
flags match_flag_type flags = regex_constants::match_default
str const char*
string basic_string
*/
1.bool regex_match(iter,iter,regex,flags)
2.bool regex_match(iter,iter,match_results,regex,flags)
3.bool regex_match(str,regex,flags)
4.bool regex_match(str,match_results,regex,flags)
5.bool regex_match(string,regex,flags)
6.bool regex_match(string,match_results,regex,flags)


If the match does not exist:
m.ready() == true//m is match_results
m.empty() == true
m.size() == 0
If the match exists:
m.ready() true
m.empty() false
m.size() number of subexpressions plus 1, that is, 1+e.mark_count()

eg:
	regex r("^select ([a-zA-Z]*) from ([a-zA-Z]*)$");
	cmatch what;
	bool ret=regex_match("select username from admin",what,r);//4 version
	cout<<ret<<endl;
	if (ret)
	{	
		for (size_t i = 0; i != what.size(); ++i)
		{
			cout<<what[i+1].first<<'\t';
		}
	}
Output:

username admin

eg://这个是以前regex中boost中时写的,在vs2010下基本也应该相同
	try{
				//^	行开头
				//()	捕获组
				//[|]	[]字符类 |或
				//{}	量词 恰好几次
				//$	行结尾
		std::string phone("^(1[3|4|5|8|9][0-9]{9})|(15[89][0-9]{8})$");//构造手机号码正则表达式
		regex reg(phone);
		std::string str_target("13975311105");
		bool r = boost::regex_match(str_target,reg);
		std::cout << " r = " << r << std::endl;
	}
	catch(boost::regex_error &e){
		std::cerr << e.what() << std::endl;
	}

2.regex_search
尝试匹配正则表达式的字符序列的任何部分
/*
iter BidirectionalIterator
match_results match_results<const iter/const char*/string,Alloc>& match_results
regex const basic_regex<CharT,Traits>& regex
flags match_flag_type flags = regex_constants::match_default
str const char*
string basic_string
*/
1.bool regex_search(iter,iter,regex,flags)
2.bool regex_search(iter,iter,match_results,regex,flags)
3.bool regex_search(str,regex,flags)
4.bool regex_search(str,match_results,regex,flags)
5.bool regex_search(string,regex,flags)
6.bool regex_search(string,match_results,regex,flags)

eg://这个是以前regex中boost中时写的,在vs2010下基本也应该相同
        boost::cmatch mat;
        boost::regex reg( "\\d+" );    //查找字符串里的数字
        if(boost::regex_search(szStr, mat, reg))
        {
            cout << "searched:" << mat[0] << endl;
        }

3.regex_replace
以格式化的替换文本来替换正则表达式匹配的地方
/*
outIter OutputIterator
iter BidirectionalIterator
match_results match_results<const iter/const char*/string,Alloc>& match_results
regex const basic_regex<CharT,Traits>& regex
flags match_flag_type flags = regex_constants::match_default
fmtStr const char*
fmtString basic_string
*/
关于fmtStr/fmtString
$& 表示替换所有匹配的子表达式
$N $N表示匹配的子表达式, N 为子表达式索引
eg:
$1$3 表示替换第1个和第3个匹配的子表达式,去掉第2个

1.outIter regex_replace(outIter,iter,iter,regex,fmtStr,flags)
2.outIter regex_replace(outIter,iter,iter,regex,fmtString,flags)
3.string regex_replace(str,regex,fmtStr,flags)
4.string regex_replace(str,regex,fmtString,flags)
5.string regex_replace(string,regex,fmtStr,flags)
6.string regex_replace(string,regex,fmtString,flags)


eg:
	string text="Quick brown fox";
	regex vowel_re("a|o|e|u|i");
	cout<<regex_replace(text,vowel_re,string("[$&]"))<<endl;//6 version
	
	Output:
	Q[u][i]ck br[o]wn f[o]x
	
eg:
	regex reg("(Colo)(u)(r)", regex::icase|regex::ECMAScript);
	string s="Colour, colours, color, colourize";
	s=regex_replace(s,reg,string("$1$3"));//替换第1个 Colo 和第3个 r,去掉 u
	//s=regex_replace(s,reg,string("$1"));//替换第1个 Colo,去掉第2个和第3个u r
	cout<<s;
	Output:
	Color, colors, color, colorize
	//Colo, colos, color, coloize

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值