(四)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 = "[email protected]";
    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 = "[email protected]";
    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()
{
    //将[email protected] 替换成[email protected]
    std::string mail("[email protected]");
    //建立3个子表达式
    boost::regex reg("(\\w+)@(\\w+).(\\w+)");
    std::cout << boost::regex_replace(mail, reg, "[email protected]$3") << std::endl;
    std::cout << boost::regex_replace(mail, reg, "[email protected]$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("[email protected], [email protected], [email protected]");
    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("[email protected], [email protected], [email protected]");
    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 );
}
时间: 2024-11-05 08:01:13

(四)boost库之正则表达式regex的相关文章

boost库学习之regex

一.背景 项目中许多地方需要对字符串进行匹配,比如根据指定的过滤字符串来过滤文件名.刚开始是排斥使用boost库的,第一,我不熟悉boost库:第二,如果引入第三方库,就会增加库的依赖,这样的后果是,要么打包程序时,打包动态库,要么直接使用静态库编译,会使增大程序的大小. 刚开始是尝试自己写模糊匹配算法,很简单,就只支持_和%,这两个通配符,然后发现Linux下有一个fnmatch的函数,就是进行模糊匹配的,它支持shell通配符. 但是到最后发现,当需要区别很相似的字符串时,模糊匹配就不行了,

VS2008下直接安装使用Boost库1 46 1版本

Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,是不折不扣的"准"标准库. Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关.大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库.但Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎.boost

在win7 + vs express for desktop中安装stlport和boost库

一.安装stlport stlport是将sgi的stl库平移到各个平台上.sgi的这个库的特点就是效率非常高.boost在这个库上面运行要比vs自带的stl库效率高.所以我们首选安装stlport. 下载stlport:http://sourceforge.net/projects/stlport/ 最新版本是5.2.1 放到C盘根目录下面,解压.进入"vs2012 x86 native tools command prompt".(注意:用cmd不行) 进入"C:\STL

VS2008下直接安装使用Boost库1.46.1版本号

Boost库是一个可移植.提供源码的C++库,作为标准库的后备,是C++标准化进程的发动机之中的一个. Boost库由C++标准委员会库工作组成员发起,当中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,是不折不扣的“准”标准库. Boost因为其对跨平台的强调,对标准C++的强调,与编写平台无关.大部分boost库功能的使用仅仅需包含对应头文件就可以,少数(如正則表達式库,文件系统库等)须要链接库.但Boost中也有非常多是实验性质的东西,在实际的开发中有用须要慎重.boost

Boost库编译安装

一.Boost库介绍         Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,其成员已近2000人. Boost库为我们带来了最新.最酷.最实用的技术,是不折不扣的“准”标准库. Boost库中比较有名的几个库: (1)Regex,正则表达式库: (2)Spirit,LL parser framework,用C

VS2008编译boost库

一.下载首先从boost官方主页http://www.boost.org/下载最新版boost安装包,我用的版本是boost.1.49.0二.新建文件夹 如果是使用下载的安装包,那么请将boost安装包解压至本地新建的目录,如:F:\boost 三.编译 (1)从vs2008的工具菜单进入命令提示窗口(单击“开始”按钮,指向“所有程序”,指向“Microsoft Visual Studio 2008”,指向“Visual Studio tools(工具)”,然后单击“Visual Studio

2015-03-12---外观模式,建造者模式,观察者模式,boost库应用

今天白天主要看了boost库的应用,主要是常用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模式,主要就是外观模式,建造者模式和观察者模式.我们从boost简要说起. 其实boost的库好多东西在c++11里面已经有了,比如bind,只不过boost的库的bind比c++11用着感觉要方便,其实有些东西我自己因为也没有用c++做过什么大的项目,所以不敢乱说,只敢说点建议性的,关于bind就是绑定

(九)boost库之文件处理filesystem

(九)boost库之文件处理filesystem filesystem库是一个可移植的文件系统操作库,它在底层做了大量的工作,使用POSIX标准表示文件系统的路径,使C++具有了类似脚本语言的功能,可以跨平台操作目录.文件,写出通用的脚本程序. 1.path的构造函数可以接受C字符串和string,也可以是一个指定首末迭代器字符串序列区间. 2.filesystem提供了一系列的文件名(或目录)检查函数. 3.有丰富的函数用于获取文件名.目录名.判断文件属性等等. 4.filesystem库使用

VS2008下直接安装Boost库1.46.1版本号

Boost图书馆是一个移植.提供源代码C++库.作为一个备份标准库,这是C++发动机之间的一种标准化的过程. Boost图书馆由C++图书馆标准委员会工作组成员发起,一些内容有望成为下一代C++标准库内容. 在C++甚大,是不折不扣的“准”标准库. Boost因为其对跨平台的强调,对标准C++的强调.与编写平台无关.大部分boost库功能的使用仅仅需包含对应头文件就可以.少数(如正則表達式库,文件系统库等)须要链接库. 但Boost中也有非常多是实验性质的东西,在实际的开发中有用须要慎重.boo