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 */ }