[C/C++11]_[初级]_[使用正则表达式库regex]
来源:互联网 发布:淘宝店铺运营包含哪些 编辑:程序博客网 时间:2024/05/21 11:13
场景
- 正则表达式在处理非常量字符串查找,替换时能很省事,如果稍微复杂点的字符串匹配, 没有正则表达式还真做不出来.
- C++11 为我们提供了正则表达式库. 使用起来比boost的正则库方便.
- 搞Java 的一定觉得很搞笑,这都是Java的标配功能, 怎么C++11才支持这个库,vs2010 以才支持.建议在处理字符串搜索替换时,直接用正则吧,代码量少,快速.
参考
std::regex_replace
std::regex_iterator
Regular Expressions (C++)
说明
- 正则表达式的语法我不多说了,vs2010 如果模式字符串写错,运行也会崩溃.一般调用正则方法时报错基本就是模式字符串写错了.
- 正则的语法真的很多,向前向后,分组…看参考吧,一般不需要全部学会就够用了.
例子
// 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\个人软件\需求文档\安卓助手\android\images\main\main.png" width="30%" height="30%">sregex_iterator ====<img src="D:\DOC\个人软件\需求文档\安卓助手\android\images\main\main.png" width="30%" height="30%"><img src="D:\DOC\个人软件\需求文档\安卓助手\android\images\main\main-about.png" width="30%" height="30%"><img src="D:\DOC\个人软件\需求文档\安卓助手\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%" height="30%"></p><ol><li>xxxxx</li></ol><p><img src="images\main\main-setting.png"width="30%" height="30%"></p>
0 2
- [C/C++11]_[初级]_[使用正则表达式库regex]
- [C/C++11]_[初级]_[使用正则表达式库进行分组查询]
- [C/C++标准库]_[初级]_[使用正则表达式过滤Windows文件名中的非法字符]
- [C/C++11语法]_[初级]_[lamba 表达式介绍]
- [C/C++标准库]_[初级]_[不使用正则替换和删除字符串]
- C++:Regex正则表达式
- C++:Regex正则表达式
- C++:Regex正则表达式
- [C/C++11]_[初级]_[使用enumerations类型]
- [C/C++标准库]_[初级]_[使用string stream]
- [sqlite3]_[初级]_[使用正则表达式REGEXP查询]
- [C/C++11]_[初级]_[实用时间库chrono]
- [wxWidgets]_[初级]_[正则表达式]
- C语言正则表达式库RegEx库
- 黑马程序员_正则表达式(regex)
- 正则表达式_环视(c#_正则分组构造)
- C语言正则表达式regex
- 【C/C++】boost regex正则表达式的安装及使用
- 【存储过程】 在java语言中调用存储过程
- [电子商务测试]版精华帖汇总
- Linux下Makefile的作用
- STM32系列第4篇--C语言复习
- Activity四种启动模式说明
- [C/C++11]_[初级]_[使用正则表达式库regex]
- flume+kafka+storm整合文件
- webview onReceivedError 接收不到404
- 【存储过程】在java语言中调用存储函数
- 关于时间戳和日期,时间的互换
- JVM线程内存区域划分
- 通过webhdfs put文件到hdfs
- iOS 之 GCD(1)
- 测试人必备:国内外最好用的6款Bug跟踪管理系统