免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版
打開APP
未登錄
開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服
開通VIP
首頁
好書
留言交流
下載APP
聯(lián)系客服
[轉(zhuǎn)載]C++:Regex正則表達(dá)式
雪柳花明
>《C++筆試 算法題準(zhǔn)備》
2017.08.14
關(guān)注
不會(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