正则表达式是一套处理文本强有力的工具;
 它使用一套复杂的语法规则,可以解决文本处理领域的绝大多数问题;
 而这些问题通常是字符串算法很难甚至无法解决的.
 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 << ] << 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\n");
    sregex ssreg = sregex::compile("power-(\\w{4})", icase);
    sregex_iterator pos1(strstr.begin(), strstr.end(), ssreg);
    sregex_iterator end;
    while(pos1 != end)
    {
        cout << ] << "]";
        ++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, -);
    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();
    ;
}

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

boost - 正则表达式xpressive的更多相关文章

  1. Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答

    Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答 Boost正则表达式库regex常用search和match示例 发表回复   Boo ...

  2. boost 正则表达式 regex

    boost 正则表达式 regex   环境安装 如果在引用boost regex出现连接错误,但是引用其他的库却没有这个错误,这是因为对于boost来说,是免编译的,但是,正则这个库 是需要单独编译 ...

  3. VS2010中使用boost正则表达式库

    1.下载boost库.http://www.boost.org/ 我下载的是boost_1_51_0版本.放在D:\opensource\boost_1_51_0. 2.编译boost库.     执 ...

  4. 在C++ Builder6上使用Boost正则表达式库

    本文关键词:正则表达式 c++ python 软件 正则表达式是一种模式匹配形式,它通常用在处理的文本程序中.比如我们经常使用的grep工具,还是perl语言都使用了正则表达式. 正则表达式是一种模式 ...

  5. Boost正则表达式的编译与使用方法集

    下载boost 在boost官网上下载任何版本都可以www.boost.org . 将boost压缩包解压到D盘目录下 (我下载的是boost_1_54_0.zip),目录为D:\boost_1_54 ...

  6. 在C语言中利用PCRE实现正则表达式

    1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...

  7. VC 中 编译 boost 1.34.1 或者 1.34.0

    c++boost正则表达式的安装方法 (cy163已成功完成实验 基于宽字节 wstring 解决 "南日" 错误 匹配"12日" expression = & ...

  8. C++11标准 STL正则表达式 验证电子邮件地址

    转自:http://www.cnblogs.com/yejianfei/archive/2012/10/07/2713715.html 我们最经常遇到的验证,就是电子邮件地址验证.网站上常见.各种网页 ...

  9. boost-tokenizer分词库学习

    boost-tokenizer学习 tokenizer库是一个专门用于分词(token)的字符串处理库;可以使用简单易用的方法把一个字符串分解成若干个单词;tokenizerl类是该库的核心,它以容器 ...

随机推荐

  1. 为什么要用 SpringMVC 的 SessionStatus

    我们可以在需要访问 Session 属性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 参数上加上 @ModelAttribute,并保 ...

  2. 关于 yii2 cron运行 console的脚本不运行,可是手动运行成功的原因

    在yii2中运行脚本出现了一个问题 手动运行没有问题. 在cron中不运行.最后找出来了原因 打开yii文件(在根文件夹以下) #!/usr/bin/env php <?php /** * Yi ...

  3. 【VBA编程】13.Workbook对象的事件

    Workbook事件用于响应对Workbook对象所进行的操作. [BeforeClose事件] BforeClose事件用于响应窗口关闭的操作 在工程资源器中,双击“ThisWorkbook”对象, ...

  4. Unix 网络编程 dup和dup2函数

    dup和dup2也是两个很实用的调用,它们的作用都是用来复制一个文件的描写叙述符. 它们经经常使用来重定向进程的stdin.stdout和stderr.这两个函数的原形例如以下: #include & ...

  5. IT痴汉的工作现状36-做好准备再上路

    软件开发流程管理是採用瀑布式好还是敏捷好? 如今非常多人会选择敏捷.由于眼下的现状是需求的变化是一天一个样,这是当前(移动)互联网的飞速发展所带来的.当我们仍採用原始的先做全盘的计划.然后在按部就班的 ...

  6. CSS3使用Animation为同一个元素添加多个动画效果

    本篇文章由:http://xinpure.com/css3-animation-for-the-same-element-multiple-animation-effects/ CSS3 Animat ...

  7. SQL中的join操作总结(非常好)

    1.1.1 摘要 Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接.外联接和交叉联接等.如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的 ...

  8. android 签名、混淆打包

    1.android 签名 使用eclipse导出带签名的apk,最简单的方式. 最后一步finish ,就能导出一个xxx.keystore的文件了. 下次再发布新版本的时候,使用这个生成的签名继续使 ...

  9. docker容器互连

    三种方式 1.使用容器连接的示例如下: $ docker run --name some-app --link itbilu-mysql:mysql -d application-that-uses- ...

  10. Vue 中的生命周期和钩子函数

    生命周期: beforeCreate:el 和 data 并未初始化 (此方法不常用) created:完成了 data 数据的初始化,el的初始化未完成.用来发送ajax beforeMount:( ...