關於正則表達式的語法和字符含義,網上已經有很不錯的博客教學,我當初參考的是
讀懂正則表達式就這么簡單 - Zery - 博客(http://www.cnblogs.com/zery/p/3438845.html)
正則表達式 – 語法 | 菜鳥教程 (http://www.runoob.com/regexp/regexp-syntax.html)
我在這里重點說明如何使用C++的regex庫完成正則匹配,正則查找,正則替換三種操作
- 首先是頭文件
1 #include<regex> 2 using namespace std;
- 正則表達式聲明
string str("\\d{4}");
regex pattern(str,regex::icase);注意與一般應用正則表達式不同,這里的轉義符號要用“\\”
- 匹配結果存放變量聲明
1 //第一種存儲方式 2 match_results<string::const_iterator> result; 3 //第二種存儲方式 4 smatch result;
這兩個類都可以存儲匹配得到的結果,建議使用第二種,比較方便
- 數據准備
1 //文本數據 2 string str="1994 is my birth year";
- 正則操作
-
- 正則匹配
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 }