1. 程式人生 > >C++11--正則表示式<regex>

C++11--正則表示式<regex>

/* 
正則表示式:一個指定的模式用來對文字中的字串提供精確且靈活的匹配
*/

#include <regex>
using namespace std;

int main() {
   string str;
   while (true) {
      cin >> str;
      //regex e("abc.", regex_constants::icase);   // .   表示除了換行符之外任意字元
      //regex e("abc?");               // ?       0個或者1個前面的字元
      //regex e("abc*");               // *       0個或多個前面的字元
      //regex e("abc+");               // +       1個或多個前面的字元
      //regex e("ab[cd]*");            // [...]   方括號中任意字元
      //regex e("ab[^cd]*");           // [^...]   任意不在方括號中的字元
      //regex e("ab[cd]{3,5}");
      //regex e("abc|de[\]fg]");         // |       或者
      //regex  e("(abc)de+\\1");       // \1      第1個子串
      //regex  e("(ab)c(de+)\\2\\1");
      //regex e("[[:w:]]
[email protected]
[[:w:]]+\.com"); // [[:w:]] :字母,數字,下劃線 //regex e("abc.$"); // $ 行尾 regex e("^abc.+", regex_constants::grep); // ^ 行首,切換正則表示式語法 //bool match = regex_match(str, e); //str和e精確匹配 bool match = regex_search(str, e); //str中中包含e cout << (match? "Matched" : "Not matched") << endl << endl; } } /* 正則表示式語法: ECMAScript //C++預設 basic extended awk grep egrep regex e("^abc.+", regex_constants::grep); // 切換語法 */ /*************** 處理子表示式 *****************/ /* std::match_results<> 儲存詳細的匹配Store the detailed matches smatch string型別的詳細的匹配Detailed match in string smatch m; m[0].str() 整個匹配的字串 (同m.str(), m.str(0)) m[1].str() 第1個子串(同m.str(1)) m[2].str() 第2個子串 m.prefix() 所有匹配字串之前的部分 m.suffix() 所有匹配字串之後的部分 */ int main() { string str; while (true) { cin >> str; smatch m; // typedef std::match_results<string> regex e("([[:w:]]+)@([[:w:]]+)\.com"); bool found = regex_search(str, m, e); //只返回第一個匹配 cout << "m.size() " << m.size() << endl; //size()==子匹配個數+1 for (int n = 0; n< m.size(); n++) { cout << "m[" << n << "]: str()=" << m[n].str() << endl; cout << "m[" << n << "]: str()=" << m.str(n) << endl; cout << "m[" << n << "]: str()=" << *(m.begin()+n) << endl; } cout << "m.prefix().str(): " << m.prefix().str() << endl; cout << "m.suffix().str(): " << m.suffix().str() << endl; } } // 多個匹配的情況 /**************** Regex Iterator ******************/ int main() { cout << "Hi" << endl; string str; while (true) { cin >> str; regex e("([[:w:]]+)@([[:w:]]+)\.com"); sregex_iterator pos(str.cbegin(), str.cend(), e); sregex_iterator end; // 預設構造定義了past-the-end迭代器 for (; pos!=end; pos++) { cout << "Matched: " << pos->str(0) << endl; cout << "user name: " << pos->str(1) << endl; cout << "Domain: " << pos->str(2) << endl; cout << endl; } cout << "=============================\n\n"; } } /**************** Regex Token Iterator ******************/ int main() { cout << "Hi" << endl; //string str = "Apple; Orange, {Cherry}; Blueberry"; string str = "
[email protected]
, [email protected]; [email protected]"; //regex e("[[:punct:]]+"); // 空格,數字,字母以外的可列印字元 //regex e("[ [:punct:]]+"); regex e("([[:w:]]+)@([[:w:]]+)\.com"); sregex_token_iterator pos(str.cbegin(), str.cend(), e, 0); //最後一個引數指定列印匹配結果的哪一部分,0表達整個匹配字串,1表示第1個子串,-1表示沒有匹配的部分 sregex_token_iterator end; // 預設構造定義了past-the-end迭代器 for (; pos!=end; pos++) { cout << "Matched: " << *pos << endl; } cout << "=============================\n\n"; cin >> str; } /**************** regex_replace ******************/ // 將匹配的字串部分替換 int main() { cout << "Hi" << endl; string str = "
[email protected]
, [email protected]; [email protected]"; regex e("([[:w:]]+)@([[:w:]]+)\.com"); regex e("([[:w:]]+)@([[:w:]]+)\.com", regex_constants::grep|regex_constants::icase ); //cout << regex_replace(str, e, "$1 is on $2"); cout << regex_replace(str, e, "$1 is on $2", regex_constants::format_no_copy|regex_constants::format_first_only);//format_no_copy不匹配的字元部分不拷貝到新串,只匹配第一個 cout << regex_replace(str, e, "$1 is on $2"); // $1表示第一個子串 std::cin >> str; }