[C/C++11]_[初級]_[使用正則表示式庫regex]
阿新 • • 發佈:2019-01-27
場景
- 正則表示式在處理非常量字串查詢,替換時能很省事,如果稍微複雜點的字串匹配, 沒有正則表示式還真做不出來.
- C++11 為我們提供了正則表示式庫. 使用起來比boost的正則庫方便.
- 搞Java 的一定覺得很搞笑,這都是Java的標配功能, 怎麼C++11才支援這個庫,vs2010 以才支援.建議在處理字串搜尋替換時,直接用正則吧,程式碼量少,快速.
參考
說明
- 正則表示式的語法我不多說了,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\个人软件\需求文چ
3;\安卓助手\android\images\main\main.png" width="30%" he
ight="30%">
sregex_iterator ====
<img src="D:\DOC\个人软件\需求文چ
3;\安卓助手\android\images\main\main.png" width="30%" he
ight="30%">
<img src="D:\DOC\个人软件\需求文چ
3;\安卓助手\android\images\main\main-about.png" width="3
0%" height="30%">
<img src="D:\DOC\个人软件\需求文چ
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>