日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BOOST库学习之正则表达式

發布時間:2024/1/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BOOST库学习之正则表达式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

本次筆記記錄如下知識點

  • 正則表達式的簡介
  • 正則表達式的匹配
  • 正則表達式的查找
  • 正則表達式的替換
  • 正則表達式的迭代
  • 一、正則表達式的簡介

    1、正則表達式的匹配規則

    • 正則表達式定義了一套復雜的語法規則,用于匹配有特定模式的字符串。在正則表達式中,大部分字符都匹配自己(普通字符),只有少量的字符用于定義特殊匹配模式的語法,如下所示:
    特別字符描述
    $匹配輸入字符串的結尾位置。要匹配 $ 字符本身,請使用 $。
    ( )標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 ( 和 )。
    *匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 *。
    +匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 +。
    ( )標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 ( 和 )。
    .匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 . 。
    [標記一個中括號表達式的開始。要匹配 [,請使用 [。
    ?匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 ?。
    \將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉義符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配換行符。序列 ‘\’ 匹配 “”,而 ‘(’ 則匹配 “(”。
    ^匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配 ^ 字符本身,請使用 ^。
    {標記限定符表達式的開始。要匹配 {,請使用 \{。
    |指明兩項之間的一個選擇。要匹配

    2、正則表達式的類摘要

    • basic_regex類的作用主要是對正則表達式解析和編譯,代碼如下:
    template<typename BidiIter> struct basic_regex {basic_regex();basic_regex(basic_regex const&); regex_id_type regex_id() const; //唯一ID std::size_t mark_count() const; //子表達式個數void swap(basic_regex&);static basic_regex; //compilc(InputRange const& pat); //靜態工廠函數};
    • match_results類的作用主要是保存正則表達式匹配的結果,代碼如下:
    template<typename BidiIter> struct match_results {size_type size() const; //子表達式個數bool empty() const; //空判斷template<typename Sub>const_referrence operator[](Sub const& i) const //獲取子表達式 };
    • sub_match類是一個類似迭代器的對象,可以把它當做一個字符串的區間表示,代碼如下:
    template<typename BidiIter> struct sub_match {//返回字符串的表示string_type str() const;//字符串長度difference_type length() const;//空區間判斷bool operator!() const;//字符串比較int compare(string_type const&) const;//是否成功匹配bool matched; };

    二、正則表達式的匹配

    • 正則匹配是通過regex_match()用來檢查一個字符串是否匹配一個正則表達式,返回bool結果
    • regex_match()函數的使用形式有如下兩種:
    //第一個參數是匹配的字符串,第二個是正則表達式對象 bool regex_match(String, basic_string const& re); //第一個參數是匹配的字符串,第二個參數是獲取查找到的字符串,第三個參數是正則表達式對象 bool regex_match(String, match_results& what basic_string const& re);

    使用如下例子來演示正則匹配的使用方式

    #include <iostream> #include <boost/xpressive/xpressive_dynamic.hpp> using namespace boost::xpressive; using namespace std;int main(int argc, char* argv[]) {//1、簡單的正則匹配//創建一個正則表達式對象cregex reg1 = cregex::compile("a.c");//判斷字符串是否匹配成功if (regex_match("abc", reg1)){cout << "匹配正確" << endl;}//驗證身份證cregex reg2 = cregex::compile("\\d{6}(1|2)\\d{3}(0|1)\\d[0-3]\\d\\d{3}(X|\\d)");if (regex_match("999555197601019999", reg2)){cout << "匹配正確" << endl;}//使用正則匹配獲取結果cregex reg3 = cregex::compile("\\d{6}((1|2)\\d{3})(0|1)(\\d[0-3]\\d)(\\d{3}(X|\\d))");cmatch what;regex_match("999555197601019999", what, reg3);//輸出匹配的結果for (auto& x :what){cout << "[" << x << "]" << endl;}return 0 ; }

    運行結果如下

    三、正則表達式的查找

    • 正則表達式的查找功能可以使用regex_search函數來進行,它的主要作用是檢測輸入的表達式中是否包含正則表達式,,即存在一個匹配正則表達式的子項。
    • regex_search函數使用形式如下:
    //第一個參數是匹配的字符串,第二個是正則表達式對象 bool regex_search(String, basic_string const& re); //第一個參數是匹配的字符串,第二個參數是獲取查找到的字符串,第三個參數是正則表達式對象 bool regex_search(String, match_results & what basic_string const& re);

    使用如下例子來演示regex_search的使用

    #include <iostream> #include <boost/xpressive/xpressive_dynamic.hpp> using namespace boost::xpressive; using namespace std;int main(int argc, char* argv[]) {char str[] = "there is a power-suit item";cregex reg = cregex::compile("(power)-(.{4})");//判斷是否能搜索到字符串if (regex_search(str, reg)){cout << "成功搜索" << endl;}//使用cmatch保存搜索到的字符cmatch what;regex_search(str, what, reg);cout << what[0] <<" " << what[1] <<" " << what[2] <<endl;return 0 ; }

    運行結果如下

    四、正則表達式的替換

    • 替換功能采用的是regex_replace函數,它的作用是先以正則表達式查找匹配的字符串,再用指定的個事將其替換。
    • regex_replace函數一個三個參數,前兩個與regex_search()相同,第三個參數是一個替換的字符串,可以用N引用正則表達式匹配的子表達式,用N引用正則表達式匹配的子表達式,用N&引用全匹配。替換完成之后,返回字符串的拷貝,使用形式如下:
    #include <iostream> #include <boost/xpressive/xpressive_dynamic.hpp> using namespace boost::xpressive; using namespace std;int main(int argc, char* argv[]) {string str("readme.txt");sregex reg1 = sregex::compile("(.*)(me)");sregex reg2 = sregex::compile("(t)(.)(t)");cout << regex_replace(str, reg1, "manual") << endl;cout << regex_replace(str, reg1, "$you") << endl;cout << regex_replace(str, reg1, "$&$&") << endl;cout << regex_replace(str, reg2, "$1N$3") << endl;return 0; }

    運行結果如下

    五、正則表達式的迭代

    • xpressive庫提供了一個強大的迭代器模板類regex_iterator,它的作用是可以遍歷正則表達式的匹配結果。
    • regex_iterator的構造函數完成迭代初始化工作,要求傳入進行分析的容器區間和正則表達式對象,之后就可以對它反復調用operator++,使用"*“或”->"獲取匹配結果的match_result對象。
      regex_iterator的使用示例如下
    #include <iostream> #include <boost/xpressive/xpressive_dynamic.hpp> using namespace boost::xpressive; using namespace std;int main(int argc, char* argv[]) {string str("Power-bomb,power-suit,pOWER-beam all items\n");sregex reg = sregex::compile("power-(\\w{4})", icase);sregex_iterator pos(str.begin(), str.end(), reg);sregex_iterator end;for (; pos != end; ++pos){cout << "[" << (*pos)[0] << "] ";}return 0; }

    運行結果如下

    總結

    以上是生活随笔為你收集整理的BOOST库学习之正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。