zoukankan      html  css  js  c++  java
  • boost

     正则表达式是一套处理文本强有力的工具;
     它使用一套复杂的语法规则,可以解决文本处理领域的绝大多数问题;
     而这些问题通常是字符串算法很难甚至无法解决的.
     C++98标准中没有内置的正则表达式支持,使得C++程序员失去一个文本处理的得力助手;
     xpressive是一个先进的、灵活的、功能强大的正则表达式库,提供了对正则表达式的全面支持;
     而且比原正则表达式库boost.regex要好的是它不需要编译,速度快,同时语法又很类似,大大降低学习难度.
     xpressive将boost.regex和boost.spirit完美融合在一起,提供动态和静态两种使用方式.

     正则表达式定义了一套完善而复杂的语法规则,用于匹配特定模式的字符串,其中,大部分的字符都可以匹配自己;
     只有极少数的字符用于定义特殊匹配模式语法,它们是:.^$()*+?{}[]|
      1、点号(.)可以匹配任意的单个字符;
      2、^匹配行的开头;
      3、$匹配行的末尾;
      4、()可以定义一个正则表达式匹配子元素(子表达式),可以被引用或重复;
      5、*表示前面的元素可以重复任意多次(n>=0);
      6、+表示前面的元素可以重复一次或多次(n>0);
      7、?表示前面的元素可以重复0次或1次(n=0或1);
      8、{}可以手工指定元素重复的次数 {n} {n,} {n,m}等;
      9、[]用于定义字符集合;
      10、是转义字符,特殊字符经转义后与自身匹配;
      11、|是逻辑或的概念,匹配它两侧之一。

    xpressive提供:
    模板类
      basic_regex 用来保存一个“正则表达式”的类。
      basic_regex(char_type const *); 从char数组构造
      basic_regex(string_type const &); 从string构造
      regex_id_type regex_id() const 返回唯一标志
      regex_id_type regex_id() const 返回匹配的子表达式的个数
      compile() 通过正则表达式参数创建
      typedef basic_regex<std::string::const_iterator> sregex;
      typedef basic_regex<char const *> cregex;
      sub_match 继承于pair<Iterator,Iterator>迭代器组,用来表示匹配的一个结果。
      match_results sub_match的容器,用来表示一次搜索或匹配算法的所有结果,类似于vector<sub_match>。
      typedef match_results<std::string::const_iterator> smatch;
      typedef match_results<char const *> cmatch;
    算法
      regex_match 匹配算法,测试一个字符串是否和一个正则式匹配,并通过match_results返回结果。
      regex_search 查找算法,查找字符串的一个和正则式匹配的字串,并通过match_results返回结果。
      regex_replace 替换算法,查找字符串中的所有匹配正则式的字串,并使用“格式化字符”串替换。

    迭代器
      regex_iterator 枚举一个字符串中所有匹配的字串,regex_iterator的结果相当于match_results。
      regex_token_iterator 枚举一个字符串中所有匹配的字串,regex_iterator的结果相当于sub_match。

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
     
    /*
        正则表达式是一套处理文本强有力的工具;
        它使用一套复杂的语法规则,可以解决文本处理领域的绝大多数问题;
        而这些问题通常是字符串算法很难甚至无法解决的.
        C++98标准中没有内置的正则表达式支持,使得C++程序员失去一个文本处理的得力助手;
        xpressive是一个先进的、灵活的、功能强大的正则表达式库,提供了对正则表达式的全面支持;
        而且比原正则表达式库boost.regex要好的是它不需要编译,速度快,同时语法又很类似,大大降低学习难度.
        xpressive将boost.regex和boost.spirit完美融合在一起,提供动态和静态两种使用方式.

        正则表达式定义了一套完善而复杂的语法规则,用于匹配特定模式的字符串,其中,大部分的字符都可以匹配自己;
        只有极少数的字符用于定义特殊匹配模式语法,它们是:.^$()*+?{}[]|
        1、点号(.)可以匹配任意的单个字符;
        2、^匹配行的开头;
        3、$匹配行的末尾;
        4、()可以定义一个正则表达式匹配子元素(子表达式),可以被引用或重复;
        5、*表示前面的元素可以重复任意多次(n>=0);
        6、+表示前面的元素可以重复一次或多次(n>0);
        7、?表示前面的元素可以重复0次或1次(n=0或1);
        8、{}可以手工指定元素重复的次数 {n} {n,} {n,m}等;
        9、[]用于定义字符集合;
        10、是转义字符,特殊字符经转义后与自身匹配;
        11、|是逻辑或的概念,匹配它两侧之一。

        xpressive提供:
        模板类:
        basic_regex          用来保存一个“正则表达式”的类。
        basic_regex(char_type const *);         从char数组构造
        basic_regex(string_type const &);       从string构造
        regex_id_type regex_id() const          返回唯一标志
        regex_id_type regex_id() const          返回匹配的子表达式的个数
        compile()                               通过正则表达式参数创建
        typedef basic_regex<std::string::const_iterator>                sregex;
        typedef basic_regex<char const *>                               cregex;
        sub_match            继承于pair<Iterator,Iterator>迭代器组,用来表示匹配的一个结果。
        match_results        sub_match的容器,用来表示一次搜索或匹配算法的所有结果,类似于vector<sub_match>。
        typedef match_results<std::string::const_iterator>              smatch;
        typedef match_results<char const *>                             cmatch;
        算法:
        regex_match          匹配算法,测试一个字符串是否和一个正则式匹配,并通过match_results返回结果。
        regex_search         查找算法,查找字符串的一个和正则式匹配的字串,并通过match_results返回结果。
        regex_replace        替换算法,查找字符串中的所有匹配正则式的字串,并使用“格式化字符”串替换。

        迭代器:
        regex_iterator       枚举一个字符串中所有匹配的字串,regex_iterator的结果相当于match_results。
        typedef regex_iterator<std::string::const_iterator>             sregex_iterator;
        typedef regex_iterator<char const *>                            cregex_iterator;
        regex_token_iterator 枚举一个字符串中所有匹配的字串,regex_iterator的结果相当于sub_match。

    */


    /************************************************************************/
    /* C++ stl Library                                                        */
    /************************************************************************/
    #include <iostream>
    #include <string>

    /************************************************************************/
    /* C++ boost Library                                                   */
    /************************************************************************/
    #include <boost/xpressive/xpressive.hpp>
    #include <boost/xpressive/xpressive_dynamic.hpp>
    #include <boost/typeof/typeof.hpp> 
    #include <boost/regex.hpp> 
    #include <boost/assign.hpp>

    using namespace boost::xpressive;
    using namespace std;

    template<typename T>
    void printWhat(T &tok)
    {
        
    for(BOOST_AUTO(pos, tok.begin()); pos != tok.end(); pos++)
        {
            cout << 
    "[" << *pos << "]" ;
        }
        cout << endl;
    }

    int main(void)
    {
        
    //简单匹配
        cregex reg1 = cregex::compile("a.c");
        assert(regex_match(
    "abc", reg1));
        assert(regex_match(
    "a+c", reg1));
    //  assert(regex_match("ac", reg1));
    //  assert(regex_match("abbc", reg1));
        
        
    //匹配身份证号码
        cregex reg2 = cregex::compile("\d{6}(1|2)\d{3}(0|1)\d[0-3]\d\d{3}(X|\d)", icase);
        assert(regex_match(
    "140581198905236818", reg2));

        cregex reg3 = cregex::compile(
    "\d{6}((1|2)\d{3})((0|1)\d)([0-3]\d)(\d{3}(X|\d))", icase);
        cmatch what;
        assert(regex_match(
    "140581198905236818", what, reg3));
        printWhat(what);
        cout << 
    "date:" << what[1] << what[3] << what[5] << endl;

        
    //匹配开头结尾
        string strTest = "Michael Jordan";
        sregex start_sreg = sregex::compile(
    "^Mi.*"); 
        sregex end_sreg = sregex::compile(
    ".*dan$"); 
        assert(regex_match(strTest, start_sreg));
        assert(regex_match(strTest, end_sreg));

        
    //查找 类似regex_match
        assert(regex_search(strTest, start_sreg));
        assert(regex_search(strTest, end_sreg));
        assert(regex_search(strTest, sregex::compile(
    "Jordan")));
        
        
    //替换
        string str = "readme.txt";
        sregex sreg1 = sregex::compile(
    "(.*)(me)"); 
        sregex sreg2 = sregex::compile(
    "(t)(.)(t)"); 
        cout << regex_replace(str, sreg1, 
    "manual") << endl;
        cout << regex_replace(str, sreg1, 
    "$lyou") << endl;
        cout << regex_replace(str, sreg1, 
    "$&$&") << endl;
        cout << regex_replace(str, sreg2, 
    "$1N$3") << endl;
        
        
    //迭代
        string strstr("Power-bomb, power-suit, pOWER-beam all items ");
        sregex ssreg = sregex::compile(
    "power-(\w{4})", icase);
        sregex_iterator pos1(strstr.begin(), strstr.end(), ssreg);
        sregex_iterator end;
        
    while(pos1 != end)
        {
            cout << 
    "[" << (*pos1)[0] << "]";
            ++pos1;
        }
        cout << endl;

        
    //分词
        //xpressive库使用模板类regex_token_iterator<>提供了强大的分词迭代器,
        //要比string_algo和tokenizer的分词能力强大,灵活得多。
        char* pstr = "Link*||+Mario+||Zelda!!!||Metroid";
        cregex creg1 = cregex::compile(
    "\w+", icase);
        cregex_token_iterator pos2(pstr, pstr + strlen(pstr), creg1);
        
    while(pos2 != cregex_token_iterator())
        {
            cout << 
    "["<< *pos2 << "]";
            ++pos2;
        }
        cout << endl;
        
    //使用分隔符则正表达式分隔符是"||"
        cregex split_reg = cregex::compile("\|\|");
        pos2 = cregex_token_iterator(pstr, pstr + strlen(pstr), split_reg, -
    1);
        
    while(pos2 != cregex_token_iterator())
        {
            cout << 
    "[" << *pos2 << "]";
            ++pos2;
        }
        cout << endl;

        
    /*
        boost.regex是Boost库的另一个正则表达式解析库,它们接口几乎完全相同,但设计思想有根本的差异,两者之间存在重要区别:
        【1】xpressive的basic_regex<>的模板参数是迭代器类型,而boost.regex是字符类型
        【2】xpressive的basic_regex<>必须使用工厂方法compile()创建,而不能从一个字符串创建。
        【3】xpressive的basic_regex<>不具有类似std::string的操作接口.
        【4】xpressive对basic_regex<>的一些定制功能位于工厂方法compile()中。
        */


        cin.get();
        
    return 0;
    }

      boost.regex是Boost库的另一个正则表达式解析库,它们接口几乎完全相同,但设计思想有根本的差异,两者之间存在重要区别:
    【1】xpressive的basic_regex<>的模板参数是迭代器类型,而boost.regex是字符类型
    【2】xpressive的basic_regex<>必须使用工厂方法compile()创建,而不能从一个字符串创建。
    【3】xpressive的basic_regex<>不具有类似std::string的操作接口.
    【4】xpressive对basic_regex<>的一些定制功能位于工厂方法compile()中。

     参考

      http://blog.csdn.net/caroline_wendy/article/details/17319899

      http://blog.csdn.net/mmzsyx/article/details/8211487

  • 相关阅读:
    如何得到运行程序的路径,以及如何得到路径的文件夹,文件名,以及类型等等信息
    STL的心得(4)运用(MFC)
    STL的心得(3)---运用(控制台)
    【Css】清除浮动,独占一行
    [Html]加链接提示
    【JS】清除子节点
    【CSS】使Div在父元素中水平居中
    [JS]回前页
    【JS】鼠标移动到链接上变手型
    【jQuery】改变控件的使能状态
  • 原文地址:https://www.cnblogs.com/MakeView660/p/7099474.html
Copyright © 2011-2022 走看看