要使用正則表達式,首先要有类库支持,C++曾经不像Java或者C#有完整的类库使用,可是在Tr1中早已提供了正则库,仅仅是非常少被人们注意罢了

TR1中包括了一个正则库,来自Boost的 regex,已经纳入了0x新标准,可是新标准遥遥无期。即便如此,如今非常多编译器也已经支持了,特别是微软,步伐最快!

尽管如今新标准还未全然支持,可是早点了解一下也是好的:

#include <iostream>
#include <regex> int _tmain(int argc, _TCHAR* argv[])
{ std::locale loc("");
std::wcout.imbue(loc); std::wstring text(_T("我的IP地址是:109.168.0.1."));
std::wstring newIP(_T("127.0.0.1"));
std::wstring regString(_T("(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)")); // 表达式选项 - 忽略大写和小写
std::regex_constants::syntax_option_type fl = std::regex_constants::icase; // 编译一个正則表達式语句
std::wregex regExpress(regString, fl); // 保存查找的结果
std::wsmatch ms; // 推断是否全行匹配
if(std::regex_match(text, ms, regExpress))
{
std::wcout<<_T("正則表達式:")<<regString<<_T("匹配:")<<text<<_T("成功.")<<std::endl;
}
else
{
std::wcout<<_T("正則表達式:")<<regString<<_T("匹配:")<<text<<_T("失败.")<<std::endl;
} // 查找
if(std::regex_search(text, ms, regExpress))
{
std::wcout<<_T("正則表達式:")<<regString<<_T("查找:")<<text<<_T("成功.")<<std::endl;
for(size_t i= 0; i < ms.size(); ++i)
{
std::wcout<<_T("第")<<i<<_T("个结果:\"")<<ms.str(i)<<_T("\" - ");
std::wcout<<_T("起始位置:")<<ms.position(i)<<_T("长度")<<ms.length(i)<<std::endl;
}
std::wcout<<std::endl; // 替换1
text = text.replace(ms[0].first, ms[0].second, newIP);
std::wcout<<_T("替换1后的文本:")<<text<<std::endl;
}
else
{
std::wcout<<_T("正則表達式:")<<regString<<_T("查找:")<<text<<_T("失败.")<<std::endl;
} // 替换2
newIP = _T("255.255.0.0");
std::wstring newText = std::regex_replace( text, regExpress, newIP);
std::wcout<<_T("替换2后的文本:")<<newText<<std::endl; // 结束
std::wcout<<_T("按回车键结束...");
std::wcin.get(); return 0;
}

[代码说明]

1. 创建正則表達式对象,有3中方法:

(1) 使用构造函数

std::regex_constants::syntax_option_type fl = std::regex_constants::icase; // 语法选项,能够设置使用哪种风格的正則表達式语法等.

std::wregex regExpress(regString, fl);

(2) 使用赋值运算符,缺点是不能指定语法选项,并且也比較低效.

std::wregex regExpress;

regExpress = regString;

(3) 使用assign方法.

std::wregex regExpress;

regExpress.assign(regString, fl);

构造正则对象的过称就是所谓的"编译".

2. regex_match() 和 regex_search()

regex_match()仅仅有在整个字符串匹配正則表達式时才返回 true, 而 regex_search()在子串匹配就返回 true.

3. 匹配结果对象 std::wsmatch.

熟悉Perl正則表達式的人都知道,匹配成功后能够用 $1 $2 ... $N 来获得子串的指, tr1 regex库把匹配结果保存在一个 std::wsmatch(UNICODE) / std::smatch(ANSI) 对象中.

std::wsmatch 是一个由若干个 std::wssub_match 对象构成的数组. 而 std::wssub_match 派生自 pair.

由std::wssub_match::first保存子串的起始位置指针(事实上说是迭代器比較准确一点).

由std::wssub_match::second保存子串的结束位置 +1 的指针(STL的通用原则,半开区间).

所以 [std::wssub_match::first,std::wssub_match::second) 就是子串的所有内容.

当然, std::wsmatch (match_result模版的提前定义类) 提供了一些简便的方法用于訪问子串:

(1) str(idx) 方法返回相应的子串的 std::string / std::wstring 对象. 仅仅是最经常使用的.

(2) position(idx) 方法返回相应子串的起始偏移量.(不是指针,是相对于首字节地址或者begin()的偏移量).

(3) length(idx) 返回子串的长度.

4. 替换子串.

前面说到 std::wssub_match::first / second 保存了子串的起始/结束位置,那么我们当然能够用这个指针(迭代器)来替换文本(见代码中的 "替换1").

或者用 std::regex_replace() 也能够达到目的(见代码中的"替换2").

使用的VC2010,一般2008 sp1以上都支持正則表達式,想要接触tr1的能够看 《C++标准程序库扩展权威指南》,这本书没什么销量,缘故大约是tr1鲜为人知吧,我买的书还在路上勒,到了之后再深入学习下!

C++ Tr1中的正則表達式的更多相关文章

  1. hive中使用正則表達式不当导致执行奇慢无比

    业务保障部有一个需求,须要用hive实时计算上一小时的数据.比方如今是12点,我须要计算11点的数据,并且必须在1小时之后执行出来.可是他们用hive实现的时候发现就单个map任务执行都超过了1小时, ...

  2. javascript中的正則表達式

    对文本数据进行操作是JavaScript中常见的任务.正則表達式通过同意程序猿指定字符串匹配的模式来简化诸如验证表单中输入是否具有正确格式之类的任务. 1.正則表達式标记: 字符 含义 举例 i 大写 ...

  3. vim中使用正則表達式

    一.使用正則表達式的命令 使用正則表達式的命令最常见的就是 / (搜索)命令. 其格式例如以下: /正則表達式 还有一个非常实用的命令就是 :s(替换)命令,将第一个//之间的正則表達式替换成第二个/ ...

  4. 对于C11中的正則表達式的使用

    Regular Expression Special Characters "."---Any single character(a "wildcard") & ...

  5. C++11中正則表達式測试

    VC++2010已经支持regex了, 能够用来编译下述代码. #include <string> #include <regex> #include <iostream ...

  6. JAVA中正則表達式总结

    昨天,我的朋友请教我正則表達式.我也好久没有写过正則表達式了,昨天刚好看了下如鹏网创始人杨中科老师关于正則表達式的解说.使我加深了正則表達式的印像.现我把他总结下: 很多语言,包含Perl.PHP.P ...

  7. JAVA中正則表達式总结(具体解释及用途)

    很多语言,包含Perl.PHP.Python.JavaScript和JScript,都支持用正則表達式处理文本,一些文本编辑器用正則表達式实现高级"搜索-替换"功能.所以JAVA语 ...

  8. python使用正則表達式

    python中使用正則表達式 1. 匹配字符 正則表達式中的元字符有 .  ^  $ *   +  ?  { }  [ ]  \  | ( ) 匹配字符用的模式有 \d 匹配随意数字 \D 匹配随意非 ...

  9. python 学习笔记 10 -- 正則表達式

    零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...

随机推荐

  1. mysql的两种存储引擎

    MySQL 有多种存储引擎,目前常用的是 MyISAM 和 InnoDB 这两个引擎,除了这两个引擎以为还有许多其他引擎,有官方的,也有一些公司自己研发的.这篇文章主要简单概述一下常用常见的 MySQ ...

  2. asyncio的简单了解

    asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要 ...

  3. Java Character & String & Scanner类

    Character类 Character 类用于对单个字符进行操作. Character 类在对象中包装一个基本类型 char 的值 char用法: char ch = 'a'; // Unicode ...

  4. kNN算法笔记

    kNN算法笔记 标签(空格分隔): 机器学习 kNN是什么 kNN算法是k-NearestNeighbor算法,也就是k邻近算法.是监督学习的一种.所谓监督学习就是有训练数据,训练数据有label标好 ...

  5. JAVA(一)变量

    public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(" ...

  6. MacBook Pro查找已安装的python目录

    MacBook Pro上下载的python安装后,发现查找目录无从下手,如下则是给出解决方案. 1.可下载pip进行安装,安装完成后,打开终端,输入:pip 并回车,则看到pip安装成功 2.再次输入 ...

  7. 使用 JQuery 实现将 table 按照列排序

    使用 JQuery 实现将 table 按照列排序 使用 JQuery 实现将 table 按照列排序 代码如下 <!DOCTYPE html> <html> <head ...

  8. .htaccess文件

    前言 看了几篇文章,发现自己对于如何维护普通的服务器安全完全不会,先从简单的.htaccess来研究吧 .htaccess文件的作用,就是更改httpd.ini文件中的配置,但作用范围仅限当前文件夹 ...

  9. python邮件

    解读Python发送邮件 Python发送邮件需要smtplib和email两个模块.也正是由于我们在实际工作中可以导入这些模块,才使得处理工作中的任务变得更加的简单.今天,就来好好学习一下使用Pyt ...

  10. Vue 2.0学习(一)简介

    简介 Vue是一套用于构建用户界面的渐进式框架.简单小巧( 压缩后仅17KB),Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手,还便于与第三方库或既 ...