yangyang12138

导航

C++标准库的正则表达式

正则用起来很方便,虽然它的真是效果并不如我们直接解析字符串快,但是的却对于编码速度和方便度来说带来极大的方便,关于正则表达式的使用,网上一搜几乎都差不多,怎么用不说,给你列一大表格,每个元字符啥意思,估计就一个文章相互转载

看了跟没看一样,今天这篇文章希望看了能帮到大家,正则表达式用法就三种 '匹配','抽取(搜索)' '替换' 对应到C++标准库里边 就是三个函数 regex_match regex_search regex_replace,

 

首先说匹配,匹配是字符串跟你规定格式完全一样才行,一般用于验证一个字符串是否符合格式,如:是否是浮点数字符串,整数字符串,是否为英文,是否为汉字等等,看代码:

wregex rx(L"^[123456789]\\d{0,})$");
wstring str(L"586")


if(regex_match(m_sSpongeLength.GetBuffer(), rx))
{
cout<<"匹配成功"<<endl;
}

匹配一般用"^[123456789]\\d{0,})$"的形式,^意为开头,$为结尾,也就是要求这个字符串从头到尾只能为数字,相对于其他两个这个最简单,基本就这些

 

再说一下抽取功能,抽取就是抽取一个文章里符合格式的字符串,如找到一个文章里 abc 子串,

wstring str(L"--abc---abc---abc---abc---");
wregex rgx(L"a(b)c");

std::wsmatch ms;

std::wstring::const_iterator start = str.begin();
std::wstring::const_iterator end = str.end();
wregex numRx(L"(\\d+)[,]");
while (regex_search(start, end, ms, numRx) )
{
start = ms[0].second;
wstring itemStr(ms[1].str());
itemStr+=tail;
cbx.AddString(itemStr.c_str());
}

ms的结果 包括了找到的子串的 首地址(ms[0].first) 尾地址(ms[0].second)尾地址可用于继续往下搜索,ms的下标指的是正则的分组,整体为一组,一个括号为一组 如上述代码的 “a(b)c” ms[0].str()为“abc” ms[1].str()为"b",这个里边要注意一个问题匹配

是要分情况处理啦,比如它要分为贪婪模式 和 非 贪婪模式 举个例子 ------a555555------ 在贪婪模式下 "a\\d+" 匹配到的是 a555555 而在非贪婪模式下匹配到的就是 a5 因为\d+是匹配到一个到多个也就是说一个是正确的 多个也是正确的

wstring str(L"--abc---abc---abc---abc---");
wregex rgx(L"a(b)c");

std::wsmatch ms; 

std::wstring::const_iterator start = str.begin();
std::wstring::const_iterator end = str.end();

regex_replace(str,rx,fmt)

替换的功能很好理解就是把 字符串内部匹配的子串 替换为fmt,可以全替换也可以只替换一个,具体可以通过第四个参数(有默认值)来设置

posted on 2016-11-11 23:35  杨杨09265  阅读(203)  评论(0)    收藏  举报