免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
[轉(zhuǎn)載]C++:Regex正則表達(dá)式
   不會(huì)用C++的Regex是硬傷,下面的內(nèi)容參考《C++程序設(shè)計(jì)原理與實(shí)踐》~~~

****************************************************************************************************
正則表達(dá)式語法
    正則表達(dá)式的特性分成很多種類,下面的內(nèi)容是perl類型的Regex。
============================================================================================
特殊含義的字符
.  :任意單個(gè)字符
[] :字符集
{} :計(jì)數(shù)
() :子模式
  :下一個(gè)字符具有特殊含義
:0個(gè)或多個(gè)
:一個(gè)或多個(gè)
:0個(gè)或一個(gè)
:或
:行的開始;否定
:行的結(jié)束
===========================================================================================
字符集
d :一個(gè)十進(jìn)制數(shù)字
l :一個(gè)小寫字母
s :一個(gè)空白符(空格符,制表符等)
u :一個(gè)大寫字母
w :一個(gè)字母(a~z或A~Z)或數(shù)字(0~9)或下劃線(_)
D :除了d之外的字符
L :除了l之外的字符
S :除了s之外的字符
U :除了u之外的字符
W :除了w之外的字符
===========================================================================================
重復(fù)
{n}  :嚴(yán)格重復(fù)n次
{n,} :重復(fù)n次或更多次
{n,m}:重復(fù)至少n次,至多m次
   :{0,}
   :{1,}
  :{0,1}
===========================================================================================
子模式
   為了指定模式中的子模式,用括號(hào)將其括起來
(d*:)?(d+):它表示字符串前半部分可以為空,若非空,則是任意長度的數(shù)字后接一個(gè)冒號(hào),后半部分是一個(gè)或多個(gè)數(shù)字的序列。
===========================================================================================
可選項(xiàng)
    |表示二選一的概念。
Subject:(FW:| Re:):表示匹配Subject:Fw:或者是Subject:Re:
===========================================================================================
正則表達(dá)式錯(cuò)誤
   當(dāng)我們將一個(gè)模式富裕regex時(shí),它會(huì)對(duì)模式進(jìn)行檢查,如果發(fā)現(xiàn)模式不合法或過于復(fù)雜,無法用于匹配時(shí),它會(huì)拋出一個(gè)bad_expression異常。
===========================================================================================
下面是一個(gè)常用的套路,比較穩(wěn)~~~

注意一點(diǎn),編譯的時(shí)候要指定鏈接:g++ -Wall -lboost_regex test.cpp -o chen
*****************************************************************************************************
正則表達(dá)式方法   
=====================================================================================================
(1)regex_match確定一行字符串是否和指定的正則表達(dá)式完全匹配
-----------------------------------------------------------------------
//檢查模式是否匹配
  8 #include<boost/regex.hpp>
  9 #include<iostream>
 10 #include<string>
 11
 12 using namespace std;
 13 using namespace boost;
 14
 15 int main()
 16 {
 17    // "w+s*((w+,d+)s*)*"
 18    regex pattern("\w+\s*(\(\w+,\d+\)\s*)*");
 19    cout << pattern<< endl;
 20    
 21    string str_1 = "chen (chen,0) (huan,1) (jiang,2)";
 22    string str_2 = "chen(chen,0)(huan,1)(jiang,2)";
 23    string str_3 = "chen";
 24    string str_4 = "(chen,0)(huan,1)(jiang,2)";
 25    string str_5 = "chen (chen,0) (huan,1)(jiang,2) chen";
 26    
 27    vector<string> strings;
 28    strings.push_back(str_1); strings.push_back(str_2);
 29    strings.push_back(str_3); strings.push_back(str_4);
 30    strings.push_back(str_5);
 31    
 32    for(int n = 0 ; n < 5 ; ++n)
 33        if(regex_match(strings[n], pattern))
 34            cout << strings[n]<< " is matched"<< endl;
 35            
 36    return 0;
 37 }  
結(jié)果為:
w+s*((w+,d+)s*)*
chen (chen,0) (huan,1) (jiang,2) is matched
chen(chen,0)(huan,1)(jiang,2) is matched
chen is matched
--------------------------------------------------------------------------
//regex_match不僅驗(yàn)證是否匹配,而且可以從中提取出正則表達(dá)式括號(hào)對(duì)應(yīng)的子串
  8 #include<boost/regex.hpp>
  9 #include<iostream>
 10 #include<string>
 11
 12 using namespace std;
 13 using namespace boost;
 14
 15 int main()
 16 {
 17    // "w+s*((w+,d+)s*)*"
 18    regex pattern("\w+\s*((\(\w+,\d+\)\s*)*)");
 19    cout << pattern<< endl;
 20    
 21    string str_1 = "chen (chen,0) (huan,1) (jiang,2)";
 22    
 23    smatch mat;
 24    if(regex_match(str_1, mat, pattern))
 25        for(smatch::iterator iter=mat.begin() ; iter!=mat.end() ;++iter)
 26            cout << *iter<<endl;
 27            
 28    return 0;
 29 }  
結(jié)果為:
w+s*(((w+,d+)s*)*)
chen (chen,0) (huan,1) (jiang,2)
(chen,0) (huan,1) (jiang,2)
(jiang,2)
注意,這個(gè)的regex表達(dá)式和上面的不同,將后面的子串((w+,d+)s*)*通過括號(hào)合并成一個(gè)完整的子串。
=====================================================================================================
(2)regex_search:regex_match是驗(yàn)證是否完全匹配,而regex_search是從一大串string中找出匹配的一小段字符串
---------------------------------------------------------------
 15 int main()
 16 {
 17    regexpattern("\d+");                           
 18    cout << pattern<< endl;
 19    
 20    string str_1 = "chen1234huan12345jiang1234567";
 21    
 22    smatch mat;
 23    if(regex_search(str_1, mat, pattern))
 24        for(smatch::iterator iter=mat.begin() ; iter!=mat.end() ;++iter)
 25            cout << *iter<<endl;
 26            
 27    return 0;
 28 }  
結(jié)果為:
1234
可以看出,regex_search是匹配到字符串中第一個(gè)符合條件的模式便會(huì)返回。
-------------------------------------------------------------
   下面的方法可以將字符串中所有匹配到的模式,全部提取出來,如下:
 15 int main()
 16 {
 17    regexpattern("\d+");                           
 18    cout << pattern<< endl;
 19    
 20    string str_1 = "chen1234huan12345jiang1234567";
 21    string::const_iterator start = str_1.begin();
 22    string::const_iterator end = str_1.end();
 23    
 24    smatch mat;
 25    while(regex_search(start, end, mat, pattern))
 26     
 27        string msg(mat[0].first, mat[0].second);
 28        cout << msg<< endl;
 29        start = mat[0].second;
 30     
 31    
 32    return 0;
 33 }  
結(jié)果是:
d+
1234
12345
1234567
****************************************************************************************************
(3)關(guān)于regex::smatch類型
   smatch類型,前綴s表示"子匹配"的概念。一個(gè)smatch本質(zhì)上是一個(gè)子匹配的向量。第一個(gè)元素是完整匹配。如果i<smatch.size(),我們將smatch[i]當(dāng)做一個(gè)字符串。對(duì)于一個(gè)正則表達(dá)式,如果最后N個(gè)子模式,則smatch.size()= N+1(因?yàn)橛幸粋€(gè)完整的匹配)。
   模式中任何放在括號(hào)中的內(nèi)容都可以作為一個(gè)子模式,可以看下面這個(gè)例子:
Expression: (ftp|http|https)://((w+.)*(w*))/([wd]+/{0,1})+
String: http://www.foo.com/bar
matches[0] = http://www.foo.com/bar
matches[1] = http
matches[2] = www.foo.com
matches[3] = foo.
matches[4] = com
matches[5] = bar
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
正則表達(dá)式內(nèi)存耗盡異常解決方案 - 星星的日志 - 網(wǎng)易博客
boost regex c++正則表達(dá)式
Boost之正則表達(dá)式
判斷身份證是否合法
去掉[]中的英文字符
把123456789轉(zhuǎn)換為12-345-6789的三種方法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服