[C/C++11]_[初級][正規表現ライブラリregexを使用]


シーン
  • 正規表現は、非常に多くの文字列検索を処理する、置換時に手間を省くことができ、少し複雑な点の文字列が一致すれば、正規表現がなければ本当にできない.
  • C++11は正規表現ライブラリを提供する.boostの正規ライブラリより使いやすい.
  • Javaをするのはきっととても面白いと感じて、これはすべてJavaの標準的な機能で、どのようにC++11はやっとこのライブラリを支持して、vs 2010はやっと支持します.文字列検索の置換を処理する時、直接正則を使うことをお勧めします.コード量が少なく、速いです.

  • リファレンス
    std::regex_replace std::regex_iterator Regular Expressions (C++)
    説明
  • 正規表現の文法はあまり言わないが、vs 2010はモード文字列が間違っていると、実行もクラッシュする.一般的に正規メソッドを呼び出す時報エラーは基本的にモード文字列の書き間違えである.
  • 正則の文法は本当に多くて、前へ後ろへ、グループ...参考にしましょう、普通はすべてマスターする必要はありませんで十分です.

  • 
    // 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>