[C/C++11]_[初级]_[使用正则表达式库regex]

场景

  1. 正则表达式在处理非常量字符串查找,替换时能很省事,如果稍微复杂点的字符串匹配, 没有正则表达式还真做不出来.
  2. C++11 为我们提供了正则表达式库. 使用起来比boost的正则库方便.
  3. 搞Java 的一定觉得很搞笑,这都是Java的标配功能, 怎么C++11才支持这个库,vs2010 以才支持.建议在处理字符串搜索替换时,直接用正则吧,代码量少,快速.

参考

std::regex_replace

std::regex_iterator

Regular Expressions (C++)

说明

  1. 正则表达式的语法我不多说了,vs2010 如果模式字符串写错,运行也会崩溃.一般调用正则方法时报错基本就是模式字符串写错了.
  2. 正则的语法真的很多,向前向后,分组…看参考吧,一般不需要全部学会就够用了.

例子


// test_reg.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <regex>
#include <string>
#include <assert.h>
#include <iostream>

static std::string kHtmlSnippet = "<p><img src=\"D:\\DOC\\个人软件\\需求文档\\安卓助手\\android\\images\\main\\main.png\" width=\"30%\" height=\"30%\"></p>"
"<ol>"
"<li>ddd中文歌</li>"
"<li>xxx</li>"
"</ol>"
"<p><img src=\"D:\\DOC\\个人软件\\需求文档\\安卓助手\\android\\images\\main\\main-about.png\" width=\"30%\" height=\"30%\"></p>"
"<ol>"
"<li>xxxxx</li>"
"</ol>"
"<p><img src=\"D:\\DOC\\个人软件\\需求文档\\安卓助手\\android\\images\\main\\main-setting.png\" width=\"30%\" height=\"30%\"></p>";

void TestReplace()
{
    std::cout << "TestReplace ====" << std::endl;

    // 把所有 img src 的绝对路径替换为 images 开始的相对路径.
    // 使用分组即可.
    std::regex img_regex("(<img [^>]*src=[\"‘]{1})([^\"‘]*)\\\\(images\\\\[^\"‘]*[\"‘]{1}[^>]*>)");
    std::smatch color_match;

    std::string rep = "$1$3";
    std::string tmp = std::regex_replace(kHtmlSnippet,img_regex,rep);
    std::cout << tmp << std::endl;

}

void TestSearch()
{
    std::cout << "TestSearch ====" << std::endl;

    // 查找所有的img完整标签
    std::regex img_regex("<img [^>]+>");

    // 使用 std::regex_search 查询第一个匹配的字符串.
    std::smatch color_match;
    std::cout << "regex_search ====" << std::endl;
    if(std::regex_search(kHtmlSnippet, color_match, img_regex))
    {
        std::cout << color_match[0] << ‘\n‘;
    }

    // 使用类 std::regex_iterator 来进行多次搜索.
    std::cout << "sregex_iterator ====" << std::endl;
    auto words_begin =
        std::sregex_iterator(kHtmlSnippet.begin(), kHtmlSnippet.end(), img_regex);
    auto words_end = std::sregex_iterator();
    for (std::sregex_iterator i = words_begin; i != words_end; ++i)
    {
        std::smatch match = *i;
        std::string match_str = match.str();
        std::cout << match_str << ‘\n‘;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    TestSearch();
    TestReplace();
    return 0;
}

输出:

TestSearch ====
regex_search ====
<img src="D:\DOC\个人软件\需求文&#x686
3;\安卓助手\android\images\main\main.png" width="30%" he
ight="30%">
sregex_iterator ====
<img src="D:\DOC\个人软件\需求文&#x686
3;\安卓助手\android\images\main\main.png" width="30%" he
ight="30%">
<img src="D:\DOC\个人软件\需求文&#x686
3;\安卓助手\android\images\main\main-about.png" width="3
0%" height="30%">
<img src="D:\DOC\个人软件\需求文&#x686
3;\安卓助手\android\images\main\main-setting.png" width=
"30%" height="30%">
TestReplace ====
<p><img src="images\main\main.png" width="30%" height="30%"></p><ol><li>ddd中文
歌</li><li>xxx</li></ol><p><img src="images\main\main-about.png" width="30%" hei
ght="30%"></p><ol><li>xxxxx</li></ol><p><img src="images\main\main-setting.png"
width="30%" height="30%"></p>
时间: 2024-08-26 04:39:31

[C/C++11]_[初级]_[使用正则表达式库regex]的相关文章

C++11 正则表达式库 (regex)

Source: http://cpprocks.com/wp-content/uploads/c++11-regex-cheatsheet.pdf C++11 正则表达式库 (regex),布布扣,bubuko.com

[C/C++11语法]_[初级]_[lamba 表达式介绍]

场景 lambda 表达式在很多语言里都有一席之地,因为它的原因,可以在函数里快速定义一个便携的函数,或者在函数参数里直接快速构造和传递. 它可以说是匿名函数对象,一般只适用于某个函数内,只做临时使用. 一般是需要在对某个数据临时特殊处理时使用,比如对某种参数类型进行限定的再次封装和行为约束. 参考 1. C# Lambda表达式及其优势 2. Lambda Expressions in C++ 3. Exception Specifications (throw) (C++) 4. noexc

[Cocoa]_[初级]_[NSTableView--数据操作和表格操作要注意的问题]

1.首先在MainMenu.lib文件里面创建一个NSTableView,在界面上显示一个表格出来,并对表格进行设置. 2.创建文件TableViewDelegate.h和TableViewDelegate.m(文件内容如下文件所示).并在MainMenu.lib文件中创建一个Object(从窗口右边选中Object,拉到在Window中的对话框中),命名:TableViewDelegate. 3.设置代理:tableView 进行设置,和图片中的Table View进行连接. staticFi

[libcurl]_[初级]_[使用libcurl下载大文件]

场景: 1. 在Windows编程时, 下载http页面(html,xml)可以使用winhttp库,但是并不是很下载文件,因为会失败. 由此引出了WinINet库,无奈这个库的稳定性比较低,使用例子又少, 下载大文件时经常是不完整,可查找的资料很少或者是没有特殊情况的解决办法. 2. 我的原则是如果系统有自带的就用系统的,但是 WinINet 要掌握需要花不少时间. 时间因素考虑到了libcurl. 3. libcurl支持ftp,http等协议的文件读取,还能自动获取文件大小, 最重要的是不

[C/C++标准库]_[初级]_[过滤Windows文件名中的非法字符]

场景: 1. 通常生成文件时需要一个文件名,而生成文件名的方式可能是通过用户输入的字符,但是有些字符在windows上是不能作为文件名的,强行创建这类文件会失败. 2.一般可以通过正则表达式替换所有的非法字符,这里实现的是C++98 template(模板)方式的替换无效字符,std::string,std::wstring. 基本上windows上和字符串打交道都离不开wstring. 函数: template<class T> void FilterInvalidFileNameChar(

[wxWidgets]_[初级]_[配置codeblock+wxWidgets3.0.1开发环境]

配置Codeblock+wxWidgets-3.0.1开发环境 作者: Sai 1. 下载codeblock,进官网,首先提醒下,下载工具一定要进官网,最新,没木马. http://www.codeblocks.org/downloads/binaries 选在SourceForge.net下载吧. codeblocks-13.12mingw-setup-TDM-GCC-481.exe 2. 下载最新wxWidgets版本 3.0.1稳定版. http://www.wxwidgets.org/d

[Android]_[初级]_[Android开发环境配置入门(Windows)]

场景: 1. 突然接到android的开发任务时如何配置android开发环境? 2. 现在的android studio是基于idea的,在我的电脑上运行奇慢和卡.而且有遗留eclipse项目,大部分教程都是基于eclipse的. 所以入门来说adt开发android程序比较适合. 3. 如果有深入研究的话,直接用其他ide配合build sdk开发也不是不行. 第一步. 配置ADT的Android开发环境. 注意1: 如果要下载所有的Android API,会耗费很大空间,所以选择比较特殊的

[Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]

场景: 1. 通过socket给Java传递byte[]数组时,utf-8的字节数组在转换为String, Java并不会遇到0就停止结束,而是一直使用完byte[]的容量, 所以在转换为Java的String需要自己判断字节值是0的位置,再截取数组长度. public static int searchByte(byte[] data, byte value) { int size = data.length; for (int i = 0; i < size; ++i) { if (data

[C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]

参考:1. http://en.cppreference.com/w/cpp/language/value_category   << Value categories >> 2. https://msdn.microsoft.com/en-us/library/dd293668.aspx   << Rvalue Reference Declarator: && >>3. https://msdn.microsoft.com/en-us/li