正则表达式
关于正则表达式就不多做介绍了,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