正则基础:正则匹配字符
- *点号(.)可以匹配任意单个字符
- *表示前面的字符可以重复任意多次(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;
}
}