c++正則表達式


basic_regex

  該類封裝了正則表達式的解析和編譯,是正則表達式的基本類。一般有兩種特化regex和wregex

template<class _Elem,
    class _RxTraits = regex_traits<_Elem> >
    class basic_regex
        : public _Regex_base
    {   //
...
typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;

match_results

  該類保存了正則表達式匹配的結果。match_results為正則表達式的匹配結果提供了一個類似容器的視圖,可以用size()和empty()判斷匹配結果中子表達式的數量,operator[]返回低i個子表達式。如果i==0,則返回整個表達式的匹配對象。

typedef match_results<const char *> cmatch;
typedef match_results<const wchar_t *> wcmatch;
typedef match_results<string::const_iterator> smatch;
typedef match_results<wstring::const_iterator> wsmatch; 

sub_match

  該模板類是一個類似迭代器的對象,繼承自std::pair,用來表示一個與子表達式匹配的序列,可以把它當作一個字符區間。

regex_replace

template<class _RxTraits,
    class _Elem>
    _STD basic_string<_Elem> regex_replace(
        const _STD basic_string<_Elem>& _Str,
        const basic_regex<_Elem, _RxTraits>& _Re,
        const _STD basic_string<_Elem>& _Fmt,
        regex_constants::match_flag_type _Flgs =
            regex_constants::match_default)
    {   // search and replace
...

  正則表達式的語法:http://help.locoy.com/Document/Learn_Regex_For_30_Minutes.htm

#include <iostream>
#include <regex>
using namespace std;

int main()
{
    
    //--------------std::regex_match: 正則表達式需要匹配整個字符串序列, 也就是說正則表達式要與
    //字符串完全匹配, 因此, 它是單次匹配, 否則匹配失敗.  它還可以獲取子匹配的組
    string str("adfd-89-@-.");
    //這里 "()" 用於捕獲組, 捕獲組的編號是按照 "(" 出現的順序, 從左到右, 從1開始進行編號的 
    regex partten("([a-z]{4})-(\\d{2}-@-\\.)");
    
    //1.只匹配是否符合正則表達式 
    cout<<regex_match(str,partten)<<endl;
    
    //2-1.匹配是否符合正則表達式並將其他一次捕獲到數組 sm[0]是匹配的正則表達式結果;match_results<string::const_iterator> sm; 
    smatch sm;
    if(regex_match(str.cbegin(),str.cend(),sm,partten))
    {
        for(match_results<string::const_iterator>::const_iterator it=sm.begin();it!=sm.end();++it)
            cout<<it->length()<<": "<<it->str()<<endl;
    }
    
    //2-2.用類match_results存儲結果 
    match_results<string::iterator> res;
    if(regex_match(str.begin(),str.end(),res,partten))
    {
        for(auto it=res.begin();it!=res.end();++it)
            cout<<it->length()<<": "<<it->str()<<endl;
    }
    
    //3.cmatch match_resluts<const char*>
    cmatch cm;
    if(regex_match(str.c_str(),cm,partten))
    {
        for(match_results<const char *>::const_iterator it=cm.begin();it!=cm.end();++it)
        {
            cout<<it->length()<<": "<<it->str()<<endl;
        }    
    }
    
    //4.
    cout<<regex_match(str.c_str(),partten)<<endl;
    
    //5.
    match_results<string::const_iterator> ress;
    if(regex_match(str,ress,partten))
    {
        for(int i=0;i<ress.size();++i)
        {
            //sub_match: 子匹配, match_results里面都存放的是sub_match
            //sub_match 可以理解為 std::pair 的擴展, 它繼承了 std::pair,
            //其中 first 實際上存放的是獲取的字符串頭指針地址, second 為尾指針地址
            ssub_match sub=ress[i];
            cout<<sub.length()<<": "<<sub.str()<<endl;
        }
    }
    
    
    //------------std::regex_search: 搜素正則表達式參數, 但它不要求整個字符序列完全匹配. 
    //而且它只進行單次搜索, 搜索到即停止繼續搜索, 不進行重復多次搜索.
    //這里 "()" 用於捕獲組, 捕獲組的編號是按照 "(" 出現的順序, 從左到右, 從1開始進行編號的
    string str1("Data-Time:2019-03-07-23:20~2019-03-08-23:59");
    regex r("(\\d{4}-)(\\d{2}-)(\\d{2})");
    
    //1.第0組一般是整個正則表達式匹配結果, 其他依次是捕獲組的結果, 它不進行重復多次搜索
    match_results<string::iterator> res1;
    if(regex_search(str1.begin(),str1.end(),res1,r))
    {
        match_results<string::iterator>::const_iterator it;
        for(it=res1.begin();it!=res1.end();++it)
            cout<<it->length()<<": "<<it->str() <<endl;
    }
    
    //2.顯示是否有搜索到符合正則表達式的結果
    cout<<regex_search(str1.begin(),str1.end(),r)<<endl;
    
    //3.與1相同。但是此次用的是smatch,
    smatch sm1;
    if(regex_search(str1.cbegin(),str1.cend(),sm1,r)) 
    {
        for(auto it=sm1.begin();it!=sm1.end();++it)
            cout<<it->length()<<": "<<it->str()<<endl;
    }
    
    //4.與1相同。但是此次用的是cmatch
    cmatch cm1;
    if(regex_search(str1.c_str(),cm1,r))
    {
        for(int i=0;i<cm1.size();++i)
        {
            csub_match cs=cm1[i];
            cout<<cs.length()<<": "<<cs.str()<<endl;
            
        }
    }
    
    //5.
    cout<<regex_search(str1,r)<<endl;
    
    //6.
    cout<<regex_search(str1.c_str(),r)<<endl;
    
    
    //--------------egex_replace: 多次搜索整個正則表達式(不考慮捕獲組),然后替換正則表達式匹配到的結果
    string str2("Date:2019-03-7~2019-03-20");
    regex r2("\\d{4}-\\d{2}-\\d{2}");
    //結果集合和替換的字符
    string result(256,'\0');
    string sub("2019-03-8");
    
    //1.regex_replace 模板函數返回值實際上是新的字符串存入變量后尾部的指針位置, 置 0 是為了防止變量數據出錯或亂碼
    *regex_replace(result.begin(),str2.begin(),str2.end(),r2,sub)='\0';
    cout<<result.c_str()<<endl;

    //2.
    result.clear();
    result.resize(256,'\0');
    result=regex_replace(str2,r2,sub);
    cout<<result.c_str()<<endl;
    return 0;
}

regex_iterator

void iterator()
{
    //std::regex_iterator
    //std::regex_iterator: 用於多次重復匹配, 不分組, 只進行多次匹配整個正則表達式,可獲取整個正則表達式的結果
   
    std::string text = "Date:2017-10-10 ~ 2017-10-15";
 
    //構造正則表達式
    //這里 "()" 用於捕獲組, 捕獲組的編號是按照 "(" 出現的順序, 從左到右, 從1開始進行編號的
    std::string pattern = "(\\d{4})-(\\d{2}-(\\d{2}))";
    std::regex express(pattern);
 
    std::regex_iterator<std::string::const_iterator> begin(text.cbegin(), text.cend(), express);
    //std::sregex_iterator == std::regex_iterator<std::string::const_iterator>
    for (auto iter = begin; iter != std::sregex_iterator(); iter++)
    {
        std::cout << iter->length() << ": " << iter->str() << std::endl;
    }
    /*輸出
    10: 2017-10-10
    10: 2017-10-15
    */
}

regex_token_iterator

void token_iterator()
{
    /////////////////////////////////////////////////////////////////////////
    //std::regex_token_iterator
    //std::regex_token_iterator: 用於多次匹配正則表達式, 它可以獲取整個正則表達式
    //的結果, 也可以獲取正則表達式的前綴, 還可以獲取正則表達式的分組子匹配
 
    std::string text = "Date:2017-10-10 ~ 2017-10-15";
 
    //構造正則表達式
    //這里 "()" 用於捕獲組, 捕獲組的編號是按照 "(" 出現的順序, 從左到右, 從1開始進行編號的
    std::string pattern = "(\\d{4})-(\\d{2}-(\\d{2}))";
    std::regex express(pattern);
 
    /*構造函數2-1*/
    //(多次匹配)顯示正則表達式匹配, 即參數 4 等於 0
    std::regex_token_iterator<std::string::const_iterator> begin2_1(text.cbegin(), text.cend(), express);
    //std::sregex_token_iterator == std::regex_token_iterator<std::string::const_iterator>
    for (auto iter = begin2_1; iter != std::sregex_token_iterator(); iter++)
    {
        std::cout << iter->length() << ": " << iter->str() << std::endl;
    }
    /*輸出
    10: 2017-10-10
    10: 2017-10-15
    */
 
    /*構造函數2-2*/
    //(多次匹配)顯示正則表達式匹配到的前綴, -1 則表示只顯示前綴
    std::regex_token_iterator<std::string::const_iterator> begin2_2(text.cbegin(), text.cend(), express, -1);
    for (auto iter = begin2_2; iter != std::sregex_token_iterator(); iter++)
    {
        std::cout << iter->length() << ": " << iter->str() << std::endl;
    }
    /*輸出
    5: Date:
    3:  ~
    */
 
    /*構造函數2-3*/
    //(多次匹配)顯示正則表達式子匹配, 3 表示第三組子匹配
    std::regex_token_iterator<std::string::const_iterator> begin2_3(text.cbegin(), text.cend(), express, 3);
    for (auto iter = begin2_3; iter != std::sregex_token_iterator(); iter++)
    {
        std::cout << iter->length() << ": " << iter->str() << std::endl;
    }
    /*輸出
    2: 10
    2: 15
    */
 
    /*構造函數3*/
    //(多次匹配)顯示正則表達式匹配到的前綴和子匹配, -1 表示前綴, 2 表示第二個子匹配
    std::vector<int> vec;
    vec.push_back(-1);
    vec.push_back(2);
    std::regex_token_iterator<std::string::iterator> begin3(text.begin(), text.end(), express, vec);
    for (auto iter = begin3; iter != std::regex_token_iterator<std::string::iterator>(); iter++)
    {
        std::cout << iter->length() << ": " << iter->str() << std::endl;
    }
    /*輸出
    5: Date:
    5: 10-10
    3:  ~
    5: 10-15
    */
 
    /*構造函數4*/
    //(多次匹配)顯示正則表達式匹配到的前綴和整個正則表達式匹配, -1 表示前綴, 0 表示匹配整個正則表達式.
    int arr[] = {-1, 0};
    std::regex_token_iterator<std::string::iterator> begin4(text.begin(), text.end(), express, arr);
    for (auto iter = begin4; iter != std::regex_token_iterator<std::string::iterator>(); iter++)
    {
        std::cout << iter->length() << ": " << iter->str() << std::endl;
    }
    /*輸出
    5: Date:
    10: 2017-10-10
    3:  ~
    10: 2017-10-15
    */
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM