C++ Boost Xpressive示例分析使用

目录
  • 一、综述
  • 二、应用示例
    • 2.1 示例 9.1
    • 2.2 示例 9.2
    • 2.3 示例 9.3
    • 2.4 示例 9.4

一、综述

与 Boost.Regex 一样,Boost.Xpressive 提供了使用正则表达式搜索字符串的函数。然而,Boost.Xpressive 使得将正则表达式写成 C++ 代码而不是字符串成为可能。这使得在编译时检查正则表达式是否有效成为可能。

只有 Boost.Regex 被合并到 C++11 中。标准库不支持将正则表达式编写为 C++ 代码。

boost/xpressive/xpressive.hpp 提供对 Boost.Xpressive 中大多数库函数的访问。对于某些函数,必须包含额外的头文件。该库的所有定义都可以在命名空间 boost::xpressive 中找到。

二、应用示例

2.1 示例 9.1

boost::xpressive::regex_match 比较字符串

示例 9.1使用 boost::xpressive::regex_match 比较字符串。

#include <boost/xpressive/xpressive.hpp>
#include <string>
#include <iostream>
using namespace boost::xpressive;
int main()
{
  std::string s = "Boost Libraries";
  sregex expr = sregex::compile("\\w+\\s\\w+");
  std::cout << std::boolalpha << regex_match(s, expr) << '\n';
}

Boost.Xpressive 基本上提供了与 Boost.Regex 相同的功能,只是它们是在 Boost.Xpressive 的命名空间中定义的。 boost::xpressive::regex_match() 比较字符串,boost::xpressive::regex_search() 搜索字符串,boost::xpressive::regex_replace() 替换字符串中的字符。您可以在示例 9.1 中看到这一点,它使用函数 boost::xpressive::regex_match(),并且看起来类似于示例 8.1。

但是,Boost.Xpressive 和 Boost.Regex 之间存在根本区别。 Boost.Xpressive 中正则表达式的类型取决于被搜索字符串的类型。因为 s 基于示例 9.1 中的 std::string,所以正则表达式的类型必须是 boost::xpressive::sregex。将此与示例 9.2 进行比较,其中正则表达式应用于类型为 const char* 的字符串

2.2 示例 9.2

boost::xpressive::cregex 类型为 const char* 的字符串

#include <boost/xpressive/xpressive.hpp>
#include <iostream>
using namespace boost::xpressive;
int main()
{
  const char *c = "Boost Libraries";
  cregex expr = cregex::compile("\\w+\\s\\w+");
  std::cout << std::boolalpha << regex_match(c, expr) << '\n';
}

对于 const char* 类型的字符串,请使用类 boost::xpressive::cregex。如果您使用其他字符串类型,例如 std::wstring 或 const wchar_t*,请使用 boost::xpressive::wsregex 或 boost::xpressive::wcregex。

对于以字符串形式编写的正则表达式,您必须调用静态成员函数 compile()。成员函数必须在用于正则表达式的类型上调用。

Boost.Xpressive 支持以 C++ 代码编写的正则表达式的直接初始化。正则表达式必须以 Boost.Xpressive 支持的符号表示(参见示例 9.3)。

2.3 示例 9.3

带有 C++ 代码的正则表达式

#include <boost/xpressive/xpressive.hpp>
#include <string>
#include <iostream>
using namespace boost::xpressive;
int main()
{
  std::string s = "Boost Libraries";
  sregex expr = +_w >> _s >> +_w;
  std::cout << std::boolalpha << regex_match(s, expr) << '\n';
}

示例 9.2 中的正则表达式写为字符串“\w+\s\w+”,现在在示例 9.3 中表示为 +_w >> _s >> +_w。它是完全相同的正则表达式。这两个示例都搜索至少一个字母数字字符,后跟一个空格,然后搜索至少一个字母数字字符。

Boost.Xpressive 使使用 C++ 代码编写正则表达式成为可能。该库为字符组提供对象。例如,对象 _w 类似于“\w”。 _s 与“\s”的含义相同。

虽然“\w”和“\s”可以在字符串中一个接一个地写入,但像_w和_s这样的对象必须与运算符连接。否则,结果将不是有效的 C++ 代码。 Boost.Xpressive 提供运算符 operator>>,在示例 9.3 中使用。

为了表示应该找到至少一个字母数字字符,_w 以加号为前缀。虽然正则表达式的语法要求量词放在字符组后面——比如“\w+”——但加号必须放在_w前面。加号是一元运算符,在 C++ 中必须放在对象前面。

Boost.Xpressive 尽可能多地模拟正则表达式的规则,因为它们可以在 C++ 中模拟。但是,也有限制。例如,问号是正则表达式中的元字符,表示前面的项目是可选的。由于问号在 C++ 中不是有效的运算符,Boost.Xpressive 将其替换为感叹号。像“\w?”这样的符号使用 Boost.Xpressive 变为 !_w,因为感叹号必须加前缀。

Boost.Xpressive 支持可以链接到表达式的动作——这是 Boost.Regex 不支持的。

2.4 示例 9.4

将动作链接到表达式

#include <boost/xpressive/xpressive.hpp>
#include <boost/xpressive/regex_actions.hpp>
#include <string>
#include <iterator>
#include <iostream>
using namespace boost::xpressive;
int main()
{
  std::string s = "Boost Libraries";
  std::ostream_iterator<std::string> it{std::cout, "\n"};
  sregex expr = (+_w)[*boost::xpressive::ref(it) = _] >> _s >> +_w;
  std::cout << std::boolalpha << regex_match(s, expr) << '\n';
}

示例 9.4 为 boost::xpressive::regex_match() 返回 true 并将 Boost 写入标准输出。

您可以将操作链接到表达式。当找到相应的表达式时执行一个动作。在示例 9.4 中,表达式 +_w 链接到操作 *boost::xpressive::ref(it) = _。该操作是一个 lambda 函数。对象 _ 指的是表达式找到的字符——在本例中是 s 中的第一个单词。相应的字符被分配给迭代器 it。因为它是一个类型为 std::ostream_iterator 的迭代器,它已经用 std::cout 进行了初始化,所以 Boost 被写入标准输出。

请注意,您必须使用函数 boost::xpressive::ref() 来包装迭代器。只有这样才能将_分配给迭代器。 _ 是 Boost.Xpressive 在命名空间 boost::xpressive 中提供的对象,通常不能将其分配给 std::ostream_iterator 类型的迭代器。因为仅当使用 +_w 找到字符串“Boost”时才会发生赋值,所以 boost::xpressive::ref() 会将赋值变成惰性操作。尽管根据 C++ 规则,附加到 +_w 的方括号中的代码会立即执行,但它只能在使用正则表达式时才对迭代器进行赋值。因此,*boost::xpressive::ref(it) = _ 不会立即执行。

示例 9.4 包含头文件 boost/xpressive/regex_actions.hpp。这是必需的,因为无法通过 boost/xpressive/xpressive.hpp 执行操作。

与 Boost.Regex 一样,Boost.Xpressive 支持迭代器以使用正则表达式拆分字符串。 boost::xpressive::regex_token_iterator 和 boost::xpressive::regex_iterator 类执行此操作。也可以将区域设置链接到正则表达式以使用全局区域之外的区域设置。

到此这篇关于C++ Boost Xpressive示例分析使用的文章就介绍到这了,更多相关C++ Boost Xpressive内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ Boost Chrono实现计时码表流程详解

    目录 一.Boost.Chrono说明 二.示例代码 一.Boost.Chrono说明 库 Boost.Chrono 提供了多种时钟.例如,您可以获取当前时间,也可以测量流程中经过的时间. Boost.Chrono 的部分内容已添加到 C++11.如果您的开发环境支持 C++11,您可以访问头文件 chrono.xml 中定义的多个时钟.但是,C++11 不支持某些功能,例如用于测量 CPU 时间的时钟.此外,只有 Boost.Chrono 支持用户定义的时间输出格式. 二.示例代码 您可以通过

  • C++ Boost StringAlgorithms超详细讲解

    目录 一.提要 二.简化字符串处理的工具和其库 三.应用Boost.StringAlgrithms库 3.1 字符大小写 3.2 删除字符串内子串 3.3 查找字符串内子串 3.4 合并字符串 3.5 子串替换 3.6 字符串修剪 3.7 创立谓词 3.8 比较 3.9 拆分字符串 3.10 查找字符串 练习 一.提要 boost C++对应的字符串对象也有一套标准操作方法.本文介绍库Boost.StringAlgorithms的若干函数和功能示例. 二.简化字符串处理的工具和其库 Boost.

  • C++ Boost shared_ptr共享指针详细讲解

    目录 一.提要 二.智能指针boost::shared_ptr与boost::scoped_ptr 三.智能指针 boost::shared_ptr用法 示例1 示例2 示例3 示例4 示例5 一.提要 boost::shared_ptr是另一个智能指针,与 boost::scoped_ptr有很大不同,本文阐述这种区别. 二.智能指针boost::shared_ptr与boost::scoped_ptr 主要区别在于: boost::shared_ptr 不一定是对象的独占所有者. 所有权可以

  • C++ Boost Format超详细讲解

    Boost.Format Boost.Format 提供了函数 std::printf() 的替代品. std::printf() 源自 C 标准并允许格式化数据输出.但是,它既不是类型安全的,也不是可扩展的. Boost.Format 提供了一种类型安全且可扩展的替代方案. Boost.Format 提供了一个名为 boost::format 的类,该类在 boost/format.hpp 中定义.与 std::printf() 类似,将包含用于控制格式的特殊字符的字符串传递给 boost::

  • C++ Boost实现数字与字符串转化详解

    目录 一.引言 二.Boost.LexicalCast 2.1 示例1 2.2 示例2 三.lexical_cast与c/c++提供类似接口的比较 3.1 两者比较 3.2 样例 一.引言 在boost库中,有一个函数Boost.LexicalCast可以将数字和字符串进行双向转换.本文介绍这种用法的案例. 二.Boost.LexicalCast Boost.LexicalCast 提供了一个转换运算符,boost::lexical_cast,它可以将数字从字符串转换为数字类型,例如 int 或

  • C++ Boost weak_ptr智能指针超详细讲解

    目录 一.提要 二.特别智能指针(Special Smart Pointers) 一.提要 在 C++11 中,boost::weak_ptr是另一类智能指针,一般是用COM组件生成.调用,本文阐述这种指针的特点和用法. 二.特别智能指针(Special Smart Pointers) 到目前为止介绍的每个智能指针都可以在不同的场景中单独使用.但是,boost::weak_ptr 仅在与 boost::shared_ptr 结合使用时才有意义. boost::weak_ptr 在 boost/w

  • C++ Boost ScopeExit超详细讲解

    目录 一.提要 二.退出作用域(Boost.ScopeExit) 2.1 范例1.UsingBOOST_SCOPE_EXIT 2.2 示例2.Boost.ScopeExit和C++11的lambda函数 2.3 示例3.特点BOOST_SCOPE_EXIT 三.练习 一.提要 资源有很多种,每种都封装一套,还是挺繁琐的!对于比较少使用或者一个程序很可能只会用一次的资源,我们不想封装,在这种情况下用Boost.ScopeExit. 二.退出作用域(Boost.ScopeExit) 库 Boost.

  • C++ Boost Xpressive示例分析使用

    目录 一.综述 二.应用示例 2.1 示例 9.1 2.2 示例 9.2 2.3 示例 9.3 2.4 示例 9.4 一.综述 与 Boost.Regex 一样,Boost.Xpressive 提供了使用正则表达式搜索字符串的函数.然而,Boost.Xpressive 使得将正则表达式写成 C++ 代码而不是字符串成为可能.这使得在编译时检查正则表达式是否有效成为可能. 只有 Boost.Regex 被合并到 C++11 中.标准库不支持将正则表达式编写为 C++ 代码. boost/xpres

  • C++ Boost Any示例分析使用

    目录 一.提要 二.Boost.Any示例 一.提要 强类型语言,例如 C++,要求每个变量都有一个特定的类型来定义它可以存储什么样的信息.其他语言,例如 JavaScript,允许开发人员将任何类型的信息存储在变量中.例如,在 JavaScript 中,单个变量可以包含一个字符串,然后是一个数字,然后是一个布尔值. 二.Boost.Any示例 Boost.Any 提供了 boost::any 类,它与 JavaScript 变量一样,可以存储任意类型的信息. 示例 23.1.使用 boost:

  • C++ Boost Phoenix库示例分析使用

    目录 一.说明 二.预先知道Boost.Phoenix 三.示例和代码 一.说明 在函数式编程模型中,函数是对象,与其他对象一样,可以作为参数传递给函数或存储在容器中.有许多支持函数式编程模型的 Boost 库. Boost.Phoenix 是这些库中最广泛.也是最重要的库.它取代了库 Boost.Lambda,它被简要介绍,但只是为了完整性. Boost.Function 提供了一个类,可以轻松定义函数指针,而无需使用源自 C 编程语言的语法. Boost.Bind 是一个适配器,即使实际签名

  • ElasticSearch学习之多条件组合查询验证及示例分析

    目录 多条件组合查询 bool constant_score 查询验证 & 分析 验证 分析 排序 默认排序 自定义排序 tips 单字段排序 多字段 scroll分页 初始化快照 & 快照保存10分钟 根据快照ID滚动查询 多条件组合查询 bool es中使用bool来控制多条件查询,bool查询支持以下参数: must:被查询的数据必须满足当前条件 mush_not:被查询的数据必须不满足当前条件 should:被查询的数据应该满足当前条件.should查询被用于修正查询结果的评分.需

  • javascript递归函数定义和用法示例分析

    递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数. 这句话理解起来并不难,从概念上出发,给出以下的例子: function foo(){ console.log("函数 foo 是递归函数."); foo(); } 这个例子的 foo 函数就是一个递归函数. 当你把这个函数拿到浏览器上运行的时候,你会发现内存溢出了,为什么呢?因为这个递归函数没有停止处理或运算的出口,因此这个递归函数就演变为一个死循环. 那如何使用递归呢? 使用递归函数必须要符合两个条件: 1. 在每一次

  • Java中时间戳的获取和转换的示例分析

    日期时间是Java一个重要的数据类型,常见的日期时间格式通常为"yyyy-MM-dd HH:mm:ss",但是计算机中存储的日期时间并非字符串形式,而是长整型的时间戳.因为字符串又占用空间又难以运算,相比之下,长整型只占用四个字节,普通的加减乘除运算更是不在话下,所以时间戳是最佳的日期时间存储方案. 获取时间戳的代码很简单,只需调用System类的currentTimeMillis方法即可,如下所示: // 从System类获取当前的时间戳 long timeFromSystem =

  • python装饰器原理源码示例分析

    目录 前言 一.什么是装饰器 二.为什么要用装饰器 三.简单的装饰器 四.装饰器的语法糖 五.装饰器传参 六.带参数的装饰器 七.类装饰器 八.带参数的类装饰器 九.装饰器的顺序 前言 最近有人问我装饰器是什么,我就跟他说,其实就是装饰器就是类似于女孩子的发卡.你喜欢的一个女孩子,她可以有很多个发卡,而当她戴上不同的发卡,她的头顶上就是装饰了不同的发卡.但是你喜欢的女孩子还是你喜欢的女孩子.如果还觉得不理解的话,装饰器就是咱们的手机壳,你尽管套上了手机壳,但并不影响你的手机功能,可你的手机还是该

  • python教程命名元组示例分析

    目录 实际上 collections.namedtuple() 是一个工厂方法,它返回的是python中标准元组类型的子类.我们提供给它一个类型名称以及相应的字段,它就返回一个可实例化的类为你已经定义好的字段传入值等. from collections import namedtuple Subscriber = namedtuble('Subscriber', ['addr', 'joined']) sub = Subscriber('jonesy@example.com', '2012-10

  • python列表的切片与复制示例分析

    大家可以先参考python切片复制列表的知识点详解这篇内容,对知识点用法有个了解 切片,即处理一个完整列表中部分数据. 语法 变量[起始索引:终止索引:步长] 首先创建一个字符串列表 >>> cars = ['toyota', 'honda', 'mazda', 'nissan', 'mitsubishi', 'subaru', 'suzuki', 'isuzu'] >>> >>> cars ['toyota', 'honda', 'mazda', '

  • 非常实用的MySQL函数全面总结详解示例分析教程

    目录 1.MySQL中关于函数的说明 2.单行函数分类 3.字符函数 4.数学函数 5.日期时间函数 6.其它常用系统函数 7.流程控制函数 8.聚合函数 1)聚合函数的功能和分类: 2)聚合函数的简单使用 3)五个聚合函数中传入的参数,所支持的数据类型有哪些? 4)聚合函数和group by的使用"最重要": 1.MySQL中关于函数的说明 "概念":类似java.python中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名: "好处":

随机推荐