(四)boost库之正则表达式regex
(四)boost库之正则表达式regex
正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼
头文件:
#include <boost/regex.hpp>
1、完全匹配
std::string str("abcd");
boost::regex reg( "a\\w*d" );
if (regex_match(str, reg))
{
std::cout << str << " is match" << std::endl;
}
else
{
std::cout << str << " is not match" << std::endl;
}
2、完全匹配并获取子串
const char* mail = "tengxun@qq.com";
boost::cmatch res;
//建立3个子表达式
boost::regex reg("(\\w+)@(\\w+).(\\w+)");
if (boost::regex_match(mail,res, reg))
{
//既可以通过迭代器获取数据, 也可以通过数组方式获取数据
for (boost::cmatch::iterator pos = res.begin(); pos != res.end(); ++pos)
{
std::cout << *pos << std::endl;
}
//res[0]存放匹配到的完整字符串
std::cout << "name:" << res[1] << std::endl;
}
3、查找, 当你不需要匹配整个字符串的时候,可以选择查找
const char* mail = "tengxun@qq.com.cn";
boost::cmatch res;
//建立3个子表达式
boost::regex reg("(\\w+)@(\\w+).(\\w+)");
if (boost::regex_search(mail,res, reg))
{
std::cout <<"**************************************" << std::endl;
//既可以通过迭代器获取数据, 也可以通过数组方式获取数据
for (boost::cmatch::iterator pos = res.begin(); pos != res.end(); ++pos)
{
std::cout << *pos << std::endl;
}
//res[0]存放匹配到的完整字符串
std::cout << "match :" << res[0] << std::endl << "name:" << res[1] << std::endl;
}
4、替换
替换匹配到的子字符串, 可以通过$N 引用第N个匹配到的值、$& 引用全匹配
#include <boost/algorithm/string.hpp>
void TestReplace()
{
//将tengxun@qq.com.cn 替换成tengxun@139.com.cn
std::string mail("tengxun@qq.com.cn");
//建立3个子表达式
boost::regex reg("(\\w+)@(\\w+).(\\w+)");
std::cout << boost::regex_replace(mail, reg, "$1@139.$3") << std::endl;
std::cout << boost::regex_replace(mail, reg, "my$1@$2.$3") << std::endl;
//自定义替换函数,regex_replace将匹配到的字符串数组传递给回调函数,由回调函数返回新的字符串
std::cout << boost::regex_replace(mail, reg, [](const boost::smatch &m){
return boost::to_upper_copy(m[0].str());
});
}
5、迭代
当需要从字符串中提取多个表达式时,可以采用迭代进行提取
std::string str("tengxun@qq.com, aa@tt.com, bb@qq.com");
boost::regex reg("(\\w+)@(\\w+).(\\w+)");
boost::sregex_iterator pos(str.begin(), str.end(), reg);
boost::sregex_iterator end;
while(pos != end)
{
std::cout << "[" << (*pos)[0] << "]";
++pos;
}
6、分词
#include <iostream>
#include <boost/regex.hpp>
void TestToken()
{
using namespace std;
using namespace boost;
string str("tengxun@qq.com, aa@tt.com, bb@qq.com");
regex reg("\\w+");
sregex_token_iterator pos(str.begin(), str.end(), reg);
while(pos != sregex_token_iterator())
{
cout << "[" << *pos << "]" ;
++pos;
}
cout << endl;
//如果最后一个参数args为-1,则把匹配到的字符串视为分隔符
regex split_reg(",");
pos = sregex_token_iterator(str.begin(), str.end(), split_reg, -1);
while(pos != sregex_token_iterator())
{
cout << "[" << *pos << "]" ;
++pos;
}
cout << endl;
//如果最后一个参数args为正数,则返回匹配结果的第args个子串
regex split_sub_reg("(\\w*)@(\\w*).(\\w*)");
pos = sregex_token_iterator(str.begin(), str.end(), split_sub_reg, 1);
while(pos != sregex_token_iterator())
{
cout << "[" << *pos << "]" ;
++pos;
}
cout << endl;
//匹配并指定输出顺序
//从下面字符串中提取日期,并转换成 年月日 的顺序输出
std::string input("01/02/2003 blahblah 04/23/1999 blahblah 11/13/1981");
regex re("(\\d{2})/(\\d{2})/(\\d{4})"); // find a date
int const sub_matches[] = { 3, 1, 2 }; // year,month, day
sregex_token_iterator begin( input.begin(), input.end(), re, sub_matches ), end;
// write all the words to std::cout
std::ostream_iterator< std::string > out_iter( std::cout, "\n" );
std::copy( begin, end, out_iter );
}
(四)boost库之正则表达式regex的更多相关文章
- boost库学习之regex
一.背景 项目中许多地方需要对字符串进行匹配,比如根据指定的过滤字符串来过滤文件名.刚开始是排斥使用boost库的,第一,我不熟悉boost库:第二,如果引入第三方库,就会增加库的依赖,这样的后果是, ...
- boost 正则表达式 regex
boost 正则表达式 regex 环境安装 如果在引用boost regex出现连接错误,但是引用其他的库却没有这个错误,这是因为对于boost来说,是免编译的,但是,正则这个库 是需要单独编译 ...
- VS2008下直接安装使用Boost库1.46.1版本
Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++ ...
- Boost库安装理解
Boost安装的安装,以及在VS2013下的使用 1. 为什么要安装? boost是一个开源库,因为开源库可以跨平台,可以通过在不同的“硬件”平台上.所以需要安装的操作. 安装,然后编译生成“静态链接 ...
- boost库在windows下的编译和使用
因为跨平台的原因,现在要使用到boost库,boost库非常大,现在处于摸索阶段. 首先来说boost库在window下的安装和使用. 一.下载 首先从boost官方主页http://www.boos ...
- Boost库
2014-08-31 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成 ...
- (九)boost库之文件处理filesystem
(九)boost库之文件处理filesystem filesystem库是一个可移植的文件系统操作库,它在底层做了大量的工作,使用POSIX标准表示文件系统的路径,使C++具有了类似脚本语言的功能 ...
- boost库的安装,使用,介绍,库分类
1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...
- VS2008编译boost库
一.下载首先从boost官方主页http://www.boost.org/下载最新版boost安装包,我用的版本是boost.1.49.0二.新建文件夹 如果是使用下载的安装包,那么请将boost安装 ...
随机推荐
- Yslow-23条规则编辑
1. 减少HTTP请求次数 合并图片.CSS.JS,改进首次访问用户等待时间. 2. 使用CDN 就近缓存==>智能路由==>负载均衡==>WSA全站动态加速 3. 避免空的 ...
- WPF笔记(2.6 ViewBox)——Layout
原文:WPF笔记(2.6 ViewBox)--Layout 在Canvas外面包一层ViewBox,可以使Canvas内的控件填充整个ViewBox,并随着ViewBox的大小变化而同步变化,这是因为 ...
- codecomb 2091【路径数量】
好久没有更新博客了啊……屯了一堆题没发呢 这是丧心病狂的hzwer每日NOI模拟赛第一天的第一题 妈蛋说好的NOIP难度图论算法两题网络流!让我说什么好 唔……codecomb的页面在晚上就会变得很奇 ...
- 电子科大POJ "统计单词"
统计单词 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) C-sources: ...
- 有二级目录的IIS配置
当项目配置文件中配置了二级目录时,如下: <!--二级目录地址--> <add key="SecondCatalog" value="/hotel&qu ...
- jdk7 中Collections.sort 异常
Collections.sort 异常 java.lang.IllegalArgumentException: Comparison method violates its general contr ...
- uva 714 - Copying Books(贪心 最大值最小化 二分)
题目描写叙述开头一大堆屁话,我还细致看了半天..事实上就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,假设最小值同样情况下有多种分配方案,输出前面份数小的,就 ...
- openssl 安装
六.运行“nmake -f ms\ntdll.mak install”安装编译后的OpenSSL到指定目录. 七.查看安装结果C:\usr\local\ssl或C:\openssl-0.9.8.e下包 ...
- uploadify按钮中文乱码问题
uploadify是一款基于jQuery库的上传插件,但很可惜的是无论你怎么设置参数buttonText ,它的中文按钮都会出现乱码的情况,现把出现原因及解决方法总结如下. 那么出现这种的 ...
- Android开发_关于如何屏蔽Home键
今天在遇到一个要屏蔽Home键的问题,研究一上午终于解决,方法记录于下: 在Android2.3版本以下重写以下方法就能屏蔽Home键: public void onAttachedToWindow( ...