C++ regex庫的三種正則表達式操作


關於正則表達式的語法和字符含義,網上已經有很不錯的博客教學,我當初參考的是

讀懂正則表達式就這么簡單 - Zery - 博客http://www.cnblogs.com/zery/p/3438845.html

正則表達式 – 語法 | 菜鳥教程  (http://www.runoob.com/regexp/regexp-syntax.html)

我在這里重點說明如何使用C++的regex庫完成正則匹配,正則查找,正則替換三種操作

  1. 首先是頭文件
    1 #include<regex>
    2 using namespace std;
  2. 正則表達式聲明
    string str("\\d{4}");
    regex pattern(str,regex::icase);

    注意與一般應用正則表達式不同,這里的轉義符號要用“\\”

  3. 匹配結果存放變量聲明
    1     //第一種存儲方式
    2     match_results<string::const_iterator> result;
    3     //第二種存儲方式
    4     smatch result;

    這兩個類都可以存儲匹配得到的結果,建議使用第二種,比較方便

  4. 數據准備
    1     //文本數據
    2     string str="1994 is my birth year";
  5. 正則操作
    • 正則匹配
      1     //正則匹配
      2     string regex_str2("(\\d{4}).*");
      3     regex pattern2(regex_str2,regex::icase);
      4 
      5     if(regex_match(str,result,pattern2)){
      6         cout<<result[0]<<endl;
      7         cout<<result[1]<<endl;
      8     }

      注意正則匹配的運算規則是先檢查正則表達式是否與文本數據一致,只有在一致的條件下才會將匹配結果送入result中。例如將正則表達式改為("\\d{4}"),返回值為FALSE,result中根本沒有結果。下圖是運行結果。我們從中看出result[0]是完整的文本,result[1]是第一個分組匹配的數據。如果正則表達式有n個分組,result的size也就是n+1個

       

    • 正則查找
       1     //文本數據
       2     string str="1994 is my birth year";
       3     //正則表達式
       4     string regex_str("\\d{4}");
       5     regex pattern1(regex_str,regex::icase);
       6 
       7     //迭代器聲明
       8     string::const_iterator iter = str.begin();
       9     string::const_iterator iterEnd= str.end();
      10     string temp;
      11     //正則查找
      12     while (std::regex_search(iter,iterEnd,result,pattern1))
      13     {
      14         temp=result[0];
      15         cout<<temp<<endl;
      16         iter = result[0].second; //更新搜索起始位置
      17     }

      首先聲明迭代器,在用while循環查找,每一次查找只會匹配一個結果

    • 正則替換
      //正則替換
          std::regex reg1("\\d{4}");
          string t("1993");
          str = regex_replace(str,reg1,t); //trim_left
          cout<<str<<endl;

      在str查找匹配的文本,並用t中的數據替換。經檢驗,這個函數會遍歷整個文本變量,也就是文本變量中所有符合正則表達式的數據都會被替換

以上就是我的經驗總結,希望能幫到你。

 最后附上所有代碼

 1 int main(){
 2 
 3     //第一種存儲方式
 4     //match_results<string::const_iterator> result;
 5     //第二種存儲方式
 6     smatch result;
 7 
 8     //文本數據
 9     string str="1994 is my birth year 1994";
10     //正則表達式
11     string regex_str("\\d{4}");
12     regex pattern1(regex_str,regex::icase);
13 
14     //迭代器聲明
15     string::const_iterator iter = str.begin();
16     string::const_iterator iterEnd= str.end();
17     string temp;
18     //正則查找
19     while (std::regex_search(iter,iterEnd,result,pattern1))
20     {
21         temp=result[0];
22         cout<<temp<<endl;
23         iter = result[0].second; //更新搜索起始位置
24     }
25 
26     //正則匹配
27     string regex_str2("(\\d{4}).*");
28     regex pattern2(regex_str2,regex::icase);
29 
30     if(regex_match(str,result,pattern2)){
31         cout<<result[0]<<endl;
32         cout<<result[1]<<endl;
33     }
34     
35     //正則替換
36     std::regex reg1("\\d{4}");
37     string t("1993");
38     str = regex_replace(str,reg1,t); //trim_left
39     cout<<str<<endl;
40         
41     return 0;
42 }

 


免責聲明!

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



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