您的位置:首页 > 编程语言 > C语言/C++

C++正则表达式库

2015-10-28 08:32 218 查看
这篇文章总结了一下C++的正则表达式库的使用方法。如有错漏,敬请指正!

简介

C++11
通过库函数的形式提供了对正则表达式的处理支持,头文件是
#include
<regex>
。这里有点要注意的是,
gcc4.8
在标准库里占了个坑,但是并没有在标准库中实现正则表达式,一旦运行标准库中的正则表达式就会抛出异常。
gcc4.9
才在标准库中实现了正则表达式。
C++11
引入的正则表达式库来自于
Boost
库的正则表达式库。实际上,这两个库提供的算法、类型,除了命名空间不一样,其它都是一样的。关于正则表达式的学习,可以参考这篇文章。关于正则表达式的处理。Boost提供可三个算法:判断整个字符串是否与正则表达式匹配:
boost::regex_match()
在字符串中搜索与正则表达式匹配的子串:
boost::regex_search()
替换掉字符串中所有与正则表达式匹配的字串:
boost::regex_replace()
正则表达式使用
boost::regex
来表示。正则表达式的匹配的子串结果使用
boost::smatch
boost::sub_match
来表示。

例子

下面通过例子和注释简单说明其用法。
#include<boost/regex.hpp>
#include<iostream>
#include<string>
usingnamespacestd;
intmain()
{
boost::regexrgx("(\\w+)\\s(\\w+)");
strings("abcdefgh");
/*boost::regex_match()当字符串和正则表达式<完全匹配>的时候返回true,否则返回false。
**/
cout<<boost::regex_match(s,rgx)<<endl;
cout<<"========分割线========"<<endl;
/*boost::regex_search()找到第一个和正则表达式匹配的子串则返回true,具体匹配子串的信息存放在
*boost::smatch类型的参数里。否则返回false。
*
*boost::smatch实际上是持有boost::sub_match的元素的容器。
*
*boost::sub_match继承自类std::pair,对应的匹配子串由first和second成员表示:[first,second)。
**/
boost::smatchresult;
if(boost::regex_search(s,result,rgx))
{
for(size_ti=0;i<result.size();++i)
{
//result[0]正则表达式的匹配结果。
//result[1]第一个分组的匹配结果。
//result[2]第二个分组的匹配结果。
cout<<result[i]<<endl;
}
}
cout<<"========分割线========"<<endl;
rgx="(\\w+)\\s\\w+";
if(boost::regex_search(s,result,rgx))
{
for(size_ti=0;i<result.size();++i)
{
//result[0]正则表达式的匹配结果
//result[1]分组的匹配结果
cout<<result[i]<<endl;
}
}
cout<<"========分割线========"<<endl;
rgx="\\w+\\s(\\w+)";
if(boost::regex_search(s,result,rgx))
{
for(size_ti=0;i<result.size();++i)
{
cout<<result[i]<<endl;
}
}
cout<<"========分割线========"<<endl;
rgx="\\w+\\s\\w+";
if(boost::regex_search(s,result,rgx))
{
for(size_ti=0;i<result.size();++i)
{
cout<<result[i]<<endl;
}
}
cout<<"========分割线========"<<endl;
rgx="(\\d+)\\s(\\w+)";
if(boost::regex_search(s,result,rgx))
{
for(size_ti=0;i<result.size();++i)
{
cout<<result[i]<<endl;
}
}
cout<<"========分割线========"<<endl;
/*遍历正则匹配整个字符串。
*/
s="abcdefghijkwww";
rgx="\\w+\\s\\w+";
autobegin=s.cbegin();
autoend=s.cend();
while(boost::regex_search(begin,end,result,rgx))
{
cout<<result[0]<<endl;
begin=result[0].second;
}
cout<<"========分割线========"<<endl;
/*
*boost::regex_replace()替换掉字符串中<所有>匹配的子串。
*/
//结果输出到一个OutputIterator。
boost::regex_replace(std::ostreambuf_iterator<char>(std::cout),s.cbegin(),s.cend(),rgx,"666666");
cout<<endl;
//直接返回结果
cout<<boost::regex_replace(s,rgx,"2233333")<<endl;//每一个匹配
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: