1. 程式人生 > >[C/C++11]_[初級]_[使用正則表示式庫regex]

[C/C++11]_[初級]_[使用正則表示式庫regex]

場景

  1. 正則表示式在處理非常量字串查詢,替換時能很省事,如果稍微複雜點的字串匹配, 沒有正則表示式還真做不出來.
  2. C++11 為我們提供了正則表示式庫. 使用起來比boost的正則庫方便.
  3. 搞Java 的一定覺得很搞笑,這都是Java的標配功能, 怎麼C++11才支援這個庫,vs2010 以才支援.建議在處理字串搜尋替換時,直接用正則吧,程式碼量少,快速.

參考

說明

  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\\&#x4E2A;&#x4EBA;&#x8F6F;&#x4EF6;\\&#x9700;&#x6C42;&#x6587;&#x6863;\\&#x5B89;&#x5353;&#x52A9;&#x624B;\\android\\images\\main\\main.png\"
width=\"30%\" height=\"30%\">
</p>" "<ol>" "<li>ddd中文歌</li>" "<li>xxx</li>" "</ol>" "<p><img src=\"D:\\DOC\\&#x4E2A;&#x4EBA;&#x8F6F;&#x4EF6;\\&#x9700;&#x6C42;&#x6587;&#x6863;\\&#x5B89;&#x5353;&#x52A9;&#x624B;\\android\\images\\main\\main-about.png\"
width=\"30%\" height=\"30%\">
</p>" "<ol>" "<li>xxxxx</li>" "</ol>" "<p><img src=\"D:\\DOC\\&#x4E2A;&#x4EBA;&#x8F6F;&#x4EF6;\\&#x9700;&#x6C42;&#x6587;&#x6863;\\&#x5B89;&#x5353;&#x52A9;&#x624B;\\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\&#x4E2A;&#x4EBA;&#x8F6F;&#x4EF6;\&#x9700;&#x6C42;&#x6587;&#x686
3;\&#x5B89;&#x5353;&#x52A9;&#x624B;\android\images\main\main.png" width="30%" he
ight="30%">
sregex_iterator ====
<img src="D:\DOC\&#x4E2A;&#x4EBA;&#x8F6F;&#x4EF6;\&#x9700;&#x6C42;&#x6587;&#x686
3;\&#x5B89;&#x5353;&#x52A9;&#x624B;\android\images\main\main.png" width="30%" he
ight="30%">
<img src="D:\DOC\&#x4E2A;&#x4EBA;&#x8F6F;&#x4EF6;\&#x9700;&#x6C42;&#x6587;&#x686
3;\&#x5B89;&#x5353;&#x52A9;&#x624B;\android\images\main\main-about.png" width="3
0%" height="30%">
<img src="D:\DOC\&#x4E2A;&#x4EBA;&#x8F6F;&#x4EF6;\&#x9700;&#x6C42;&#x6587;&#x686
3;\&#x5B89;&#x5353;&#x52A9;&#x624B;\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>