转:C++ Boost/tr1 Regex(正则表达式)快速指南

C++ Boost/tr1 Regex(正则表达式)快速指南

正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分。

本文以Boost 1.39正则表达式为基础,应该广泛适用于其他版本的Boost。对namespace稍加修改,即可适用tr1标准。

0、regex对象

类似于Java中的Pattern,Boost中的正则表达式对象为:

boost::regex

常见构造方法2种:

1

2

3

4

5

// 1. 直接使用正则表达式的字符串构造。

boost::regex reg1("\\d{18}");

// 2. 加入参数regex_constants,这里是忽略大小写case

boost::regex reg2("ok", boost::regex::icase);

1、regex_match

首先要明确match和search的区别:

  • match针对整个字符串,若整个串匹配,match返回true,否则false。
  • search非针对整串,若任意部分子串匹配,search返回true,否则false。

明确了这点之后,来看regex_match的三种常见用法:

(1) 使用string字符串、regex对象直接match。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <boost/regex.hpp>

#include <iostream>

#include <string>

using namespace std;

int main()

{

// Match the whole string

// regex_match(str, regex)

boost::regex pat1("(\\d{4}-){3}\\d{4}");

string card_str("1234-5678-4321-8765");

cout << boost::regex_match(card_str, pat1) << endl;

cout << boost::regex_match(card_str, boost::regex("\\d{12}")) << endl;

cout << "----" << endl;

return 0;

}

这个简单明了:若card_str全串匹配了,返回1,否则0。

输出如下:

1

2

3

1

0

----

(2) 使用迭代器替换string,并给regex加入参数

如下所述,我们知道string的头3个、尾3个是垃圾字符,可以用迭代器指明match工作的begin和end位置。注意的是:boost中,不提供string、begin(int)、end(int)这种参数形式。

同时,在构造regex的时候,我们给定了一个参数boost::regex::icase,表示该正则对象将忽略大小写!

1

2

3

4

5

6

7

// Match the whole string, define string by iterator, ignore case

// regex_match(begin, end, regex, flags)

string card_str2("|||1234-5678-4321-8765OK|||");

boost::regex pat2("(\\d{4}-){3}\\d{4}ok", boost::regex::icase);

cout << boost::regex_match(card_str2.begin()+3, card_str2.end()-3, pat2) << endl;

cout << boost::regex_match(card_str2.begin()+3, card_str2.end()-3, boost::regex("(\\d{4}-){3}\\d{4}ok")) << endl; // Case wrong

cout << "----" << endl;

输出如下:

1

2

3

1

0

----

(3) match,并返回分组的match result

我们都知道,正则中的括号表示分组,例如:

字符串和正则:

1

2

boost::regex pat3("(\\d{4})-(\\d{4})-(\\d{4})-(\\d{4})");

string card_str3("1234-5678-4321-8765");

pat3中有4个分组,则regex_match后,match result会形成5个分组,0为全串,1~4分别为1234、5678、4321、8765。

好了,看下用法吧:

1

2

3

4

5

6

7

8

9

10

11

// Match the whole string, return the match part

boost::regex pat3("(\\d{4})-(\\d{4})-(\\d{4})-(\\d{4})");

string card_str3("1234-5678-4321-8765");

boost::smatch mat3;

cout << boost::regex_match(card_str3, mat3, pat3) << endl;

cout << mat3.size() << endl;

for(size_t i=0; i<mat3.size(); i++)

{

cout << "Match " << i << ":" << mat3[i].str() << endl;

}

cout << "----" << endl;

输出如下:

1

2

3

4

5

6

7

8

1

5

Match 0:1234-5678-4321-8765

Match 1:1234

Match 2:5678

Match 3:4321

Match 4:8765

----

这里要再多解释一下,smatch是match_result的模版特例化类型,特别针对std::string的:

1

2

3

4

5

6

7

8

9

class match_results;

typedef match_results<const char*> cmatch;

typedef match_results<const wchar_t*> wcmatch;

typedef match_results<string::const_iterator> smatch;

typedef match_results<wstring::const_iterator> wsmatch;

 2、regex_search

下面考虑对字符串任意部分匹配的regex_search。

您可能也喜欢如下文章:

  1. C++ Boost智能指针(smart_ptr)快速指南
  2. 两道面试题……
  3. 大量数据取k个最大值并排序
  4. 《数据结构》读书笔记 第四章 串的基本操作
  5. C++大作业–单件类(Singleton)的实现
时间: 2024-10-22 07:08:03

转:C++ Boost/tr1 Regex(正则表达式)快速指南的相关文章

(四)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"

正则表达式快速入门,转载

正则表达式快速入门 首先简单介绍下正则表达式: 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 下面就看看正则表达式里乱七八糟的字符都是什么意思: 1.常用的元字符       代码                               说明                     . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d

从 C++ 到 Objective-C 的快速指南

英文原文:From C++ to Objective-C: A quick guide for practical programmers 标签: Objective-C C/C++ 233人收藏此文章, 我要收藏oschina 推荐于 2年前 (共 11 段, 翻译完成于 05-13) (29评) 参与翻译(4人): leoxu, 无若, nbafifa02, 地狱星星 仅中文 | 中英文对照 | 仅英文 | 打印此文章 简介 当我开始为iOS写代码的时候,我意识到,作为一个C++开发者,我必

Emacs 快速指南 - 原生中文手册

Emacs 快速指南 -折叠目录 1. 小结(SUMMARY) 2. 基本的光标控制(BASIC CURSOR CONTROL) 3. 如果 EMACS 失去响应(IF EMACS STOPS RESPONDING) 4. 被禁用的命令(DISABLED COMMANDS) 5. 窗格(WINDOWS) 6. 插入与删除(INSERTING AND DELETING) 7. 撤销(UNDO) 8. 文件(FILE) 9. 缓冲区(BUFFER) 10. 命令集扩展(EXTENDING THE C

(译)快速指南:用UIViewPropertyAnimator做动画

翻译自:QUICK GUIDE: ANIMATIONS WITH UIVIEWPROPERTYANIMATOR 译者:Haley_Wong iOS 10 带来了一大票有意思的新特性,像 UIViewPropertyAnimator,它是一个改善动画处理的全新的类. 这个视图属性动画完全颠覆了我们已经习惯的流程,能够为动画逻辑添加更精细的控制. 一个简单的动画 让我们来看看如何通过一个简单的动画改变视图的中心点属性. let animator = UIViewPropertyAnimator(du

JavaScript正则表达式快速判断技巧

原文:JavaScript正则表达式快速判断技巧 这里是JS的正则的一点心得,并不是最完整的规则汇总,更侧重实际运用中的快速判断,初学者接触正则之后往往会被一堆星号括号给弄晕,有了一些速判技巧就能从整体上把握从而不慌乱. JS正则快速判断技巧的核心就是:注意圆括号和问号.这已经能够应付大部分实际应用了. 一.圆括号 众所周知,正则中中括号表示范围,大括号表示重复次数,圆括号表示分组. 圆括号表示分组,但是分组内还有很多文章,细分一下: (1):圆括号本身表示分组,同时会保存匹配的项,这叫捕获性分

Shell 快速指南

目录 Shell 快速指南??概述????什么是 shell????什么是 shell 脚本????Shell 环境??????指定脚本解释器????模式??????交互模式??????非交互模式??Shell 编程????解释器????注释????变量??????局部变量??????环境变量??????位置参数????Shell扩展??????大括号扩展??????命令置换??????算数扩展??????单引号和双引号????数组??????创建数组??????获取数组元素??????获取数组

【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

[SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https://dzone.com/articles/quick-guide-to-microservices-with-kubernetes-sprin 作者:Piotr Mińkowski 译者:Darren Luo 在本教程中你将学习如何使用 Kubernetes 和 Docker 快速启动并运行 Sp

Emacs 快速指南(中文翻译)

Emacs 快速指南 目录 1. 小结(SUMMARY) 2. 基本的光标控制(BASIC CURSOR CONTROL) 3. 如果 EMACS 失去响应(IF EMACS STOPS RESPONDING) 4. 被禁用的命令(DISABLED COMMANDS) 5. 窗格(WINDOWS) 6. 插入与删除(INSERTING AND DELETING) 7. 撤销(UNDO) 8. 文件(FILE) 9. 缓冲区(BUFFER) 10. 命令集扩展(EXTENDING THE COMM