正则表达式在字符串操作中有这很重要的地位,可以高效的完成字符串的匹配、查找、替换等操作。Boost.Xpressive是一个正则表达式模板库。在学习Boost.Xpressive之前需要对正则表达式的匹配规则有一定的了解。这里选择Boost.Xpressive而不选择Boost.Regex是因为Boost.Xpressive的功能更强大。Boost.Xpressive由dynamic regexes和static regexes两个库。其中dynamic regexes的功能与Boost.Regex一致。这里主要涉及dynamic regexes。
正则表达式
正则表达式元字符
1、基础
\:转义字符
^:匹配字符串的开始位置
$:匹配字符串的结束位置
.:匹配'\n'之外的单个字符
2、贪婪(重复)
+:一次或多次
?:零次或一次
*:零次或多次
:出现n次
:至少出现n次
:至少出现n次,最多出现m次
+、?、*、、、等后面加?表示惰性算法
贪婪:最大化匹配
惰性:最小化匹配
3、分组与捕获
(pattern):匹配pattern并获取
(?:pattern):匹配pattern但不获取
(?Ppattern):分组命名捕获
4、零宽断言
(?=pattern):正向肯定预查
(?!pattern):正向否定预查
(?
(?
5、分支
|:或
6、范围
[xyz]:字符集合。匹配所包含的任意一个字符
[^xyz]:负值字符集合。匹配未包含的任意一个字符
[a-z]:字符范围。匹配字符范围内的任意字符
[^a-z]:负值字符范围。不匹配字符范围内的任意字符
7、常用转义
\b:匹配一个单词的边界
\B:匹配非单词边界
\d:匹配一个数字字符[0-9]
\D:匹配一个非数字字符[^0-9]
\s:匹配任意空白字符[\f\n\r\t\v]
\S:匹配任意非空白字符[^\f\n\r\t\v]
\w:匹配任何单词字符,包括下划线[A-Za-z0-9]
\W:匹配任何非单词字符,[^A-Za-z0-9]
创建Regex对象
创建dynamic regex有两种途径:1、regex_compiler类模板2、basic_regex::compile()函数。basic_regex: compile()是根据regex_compiler来实现的。
//使用regex_compiler类模板构建Regex对象
sregex_compilercompiler;
sregexregex=compiler.compile("this|that",regex_constants::icase);
//使用basic_regex::compile()函数函数构建Regex对象
sregexregex=sregex::compile("this|that",regex_constants::icase);
匹配
regex_match()算法检查regex是否匹配输入的字符串。regex_match()只有在regex从头到尾匹配整个输入字符串时才会返回true。如果regex只匹配输入字符串的一部分,则regex_match()将返回false。在所有情况下,用于遍历输入序列的迭代器类型必须与用于声明regex对象的迭代器类型匹配。regex_match()算法可选择性地接受match_results struct作为out参数。如果给定,regex_match()算法将在match_results结构中填充关于regex的哪些部分匹配输入的哪些部分的信息。
/**
*邮箱匹配测试
**/
#include
#include
#include
#include
intmain(intargc,char*argv[]){
usingnamespaceboost::xpressive;
std::stringemail="zhao_yong_ming@126.com";
smatchwhat;
sregexregex=sregex::compile("(\\w+)@(\\w+).(\\w+)",regex_constants::icase);
if(regex_match(email,what,regex)) {
for(size_ti=;i
std::cout
}
}
system("pause");
return;
}
==================================================================================================
程序运行结果:
zhao_yong_ming@126.com
zhao_yong_ming
126
com
查找
当您想知道输入序列中是否包含regex匹配的子序列时,使用regex_search()。regex_search()将尝试在输入序列的开头匹配regex,并在序列中后扫描,直到找到匹配项或耗尽序列。与regex_match()一样,您可以选择提供一个match_results struct来接收搜索结果,以及一个match_flag_type位掩码来控制如何计算匹配。regex_search与regex_match相似,但是不要求完全匹配,只要一个子表达式匹配就返回true。
/**
*查找子字符串readme.md或readme.txt是否存在于输入字符串
**/
#include
#include
#include
#include
intmain(intargc,char*argv[]) {
usingnamespaceboost::xpressive;
std::stringline="The readme.md is here. Where is the doumention named readme.txt?";
smatchwhat;
sregexregex=sregex::compile("readme\\.\\w+");
if(regex_search(line,what,regex)) {
std::cout
for(size_ti=;i
std::cout
}
}
system("pause");
return;
}
==================================================================================================
程序运行结果:
查询记录条数:1
readme.md
替换
使用regex_replace()执行搜索和替换非常简单。您所需要的是输入序列、regex对象、格式字符串或格式化程序对象。
/**
*
**/
#include
#include
#include
#include
intmain(intargc,char*argv[]) {
usingnamespaceboost::xpressive;
std::stringsource="Boost.Regex is a useful regex library,and Regex is efficient.";
sregexregex=sregex::compile("(Regex)");
std::stringformat="Xpressive";
std::stringdest=regex_replace(source,regex,format);
std::cout
std::cout
system("pause");
return;
}
==================================================================================================
程序运行结果:
Boost.Regexisausefulregexlibrary,andRegexisefficient.
Boost.Xpressiveisausefulregexlibrary,andXpressiveisefficient.
遍历
regex_iterator
查找与regex匹配的所有子字符串,并一次逐个遍历它们。regex_iterator解引用返回的是一个match_results。使用*或者->获取匹配的结果match_results对象的值。
/**
*将[0.0001 0.0002 0.0003][0.0004 0.0005 0.0006]中的所有数字提取出来
**/
#include
#include
#include
#include
intmain(intargc,char*argv[]) {
usingnamespaceboost::xpressive;
std::stringline="[0.0001 0.0002 0.0003][0.0004 0.0005 0.0006]";
sregexregex=sregex::compile("((\\d+)?\\.(\\d+))");
sregex_iteratorit_begin(line.begin(),line.end(),regex);
sregex_iteratorit_end;
for(sregex_iteratorit=it_begin;it!=it_end;it++) {
std::coutstr()
}
system("pause");
return;
}
==================================================================================================
程序运行结果:
0.0001
0.0002
0.0003
0.0004
0.0005
0.0006
regex_token_iterator
//regex_token_iterator的构造方法
//1
regex_token_iterator(BidiIterbegin,BidiIterend,
basic_regexconst&rex);
//2
template
regex_token_iterator(BidiIterbegin,BidiIterend,
basic_regexconst&rex,unspecifiedargs);
//3
template
regex_token_iterator(BidiIterbegin,BidiIterend,
basic_regexconst&rex,
Subsconst&subs,
regex_constants::match_flag_typeflags=regex_constants::match_default);
//4
template
regex_token_iterator(BidiIterbegin,BidiIterend,
basic_regexconst&rex,
Subsconst&subs,unspecifiedargs,
regex_constants::match_flag_typeflags=regex_constants::match_default);
Parameters:
args:Alet()expressionwithargumentbindingsforsemanticactions. (detail::let_const&args)
begin:搜索序列的begin()
end:搜索序列的end()
flags:可选的匹配标志,用于控制表达式如何与序列匹配(Seematch_flag_type.)
rex:正则表达式
subs:Arangeofintegersdesignatingsub-matchestobetreatedastokens.subsiseitheranintegergreaterorequalto-1,orelseanarrayornon-emptystd::vectorofsuchintegers. (subs大于或等于-1的整数,数组或非空std::vector的这些整数)
使用构造方法_1
regex_token_iterator(BidiIter begin, BidiIter end, basic_regexconst & rex);使用该构造方法的操作结果regex_iterator遍历匹配结果一致。
/**
*将[0.0001 0.0002 0.0003][0.0004 0.0005 0.0006]中的所有数字提取出来
**/
#include
#include
#include
#include
intmain(intargc,char*argv[]){
usingnamespaceboost::xpressive;
std::stringline="[0.0001 0.0002 0.0003][0.0004 0.0005 0.0006]";
sregexregex=sregex::compile("((\\d+)?\\.(\\d+))");
sregex_token_iteratorit_begin(line.begin(),line.end(),regex);
sregex_token_iteratorit_end;
for(sregex_token_iteratorit=it_begin;it!=it_end;it++) {
std::coutstr()
}
system("pause");
return;
}
==================================================================================================
程序运行结果:
0.0001
0.0002
0.0003
0.0004
0.0005
0.0006
使用构造方法_3
template
regex_token_iterator(BidiIterbegin,BidiIterend,
basic_regexconst&rex,
Subsconst&subs,
regex_constants::match_flag_typeflags=regex_constants::match_default);
使用regex_token_iterator的这个构造方法,通过传入配置参数Subs const & sub实现不用的需求。sub使用不同的值将得到不同的sub_match的结果:sub = -1:返回与正则表达式不匹配的字符串。相当于把正则表达式部分作为分隔符来使用。sub = 0 :返回与正则表达式完全匹配的字符串。sub = 1、2 ... n:返回与正则表达式匹配的n个子匹配的字符串(由第n个sub-expression匹配)。
领取专属 10元无门槛券
私享最新 技术干货