程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [C/C++11]_[初級]_[使用正則表達式庫regex]

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

編輯:關於C語言

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


場景

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

說明

正則表達式的語法我不多說了,vs2010 如果模式字符串寫錯,運行也會崩潰.一般調用正則方法時報錯基本就是模式字符串寫錯了. 正則的語法真的很多,向前向後,分組…看參考吧,一般不需要全部學會就夠用了.

例子

<code class="language-html hljs ">
// test_reg.cpp : 定義控制台應用程序的入口點。
//

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

static std::string kHtmlSnippet = "<p><img data-cke-saved-src="\" src="\"D:\\DOC\\個人軟件\\需求文檔\\安卓助手\\android\\images\\main\\main.png\"" width="\"30%\"" height="\"30%\""></p>"
"<ol><li>"
"</li><li>ddd中文歌</li><li>"
"</li><li>xxx</li><li>"
"</li></ol>"
"<p><img data-cke-saved-src="\" src="\"D:\\DOC\\個人軟件\\需求文檔\\安卓助手\\android\\images\\main\\main-about.png\"" width="\"30%\"" height="\"30%\""></p>"
"<ol><li>"
"</li><li>xxxxx</li><li>"
"</li></ol>"
"<p><img data-cke-saved-src="\" 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;
}
</iostream></assert.h></string></regex></code>

輸出:

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>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved