在我的專案開發生涯中,許多地方都用到了正規表示式,每種語言的都嘗試過。而c++的正規表示式相比其他語言的用法要複雜一些,尤其比perl複雜的的多,但是萬變不離其宗,其本質內容還是保持一致的,下面介紹一下c++正規表示式的結構:
正規表示式結構按字串寬窄和常量非常量可以分為四族:
1.正則正規化
regex型別,用法
string str("a*");
regex r(str)
r是乙個正則正規化,初始化接受乙個string物件。注意,是先構造string,然後再將string傳給regex物件,所以對於string裡的特殊字元----雙引號、單引號、斜槓----需要進行轉義處理。
string s1("\"");
regex r1(s1);//相當於構造了乙個/"/正規表示式
string s2("\'");
regex r2(s2)//相當於構造了乙個/'/正規表示式
string s3("\\n");
regex r3(s3)//相當於構造了乙個/\n/正規表示式
2.匹配函式
regex_match,匹配指定字串完整序列是否與正規表示式匹配,匹配返回true否則返回false。
regex_search,匹配指定字串內是否包含與正規表示式匹配的子串行,匹配則返回true,否則返回false。
regex_replace,將指定字串中與正規表示式匹配的子串行進行替換,返回值為替換後的字串。
還有個小插曲sregex_iterator
這些都稍後講
3.儲存容器
smatch型別,用法
string str;
regex r(str);
smatch result;
regex_search(str,result,r);
cout正則的運用
1.bool regex_match(seq,m,r,mft)string str="niulei2";
string pattern("[a-z]*");
regex r(pattern);
smatch result;
bool flag=regex_match(str,result,r);
cout《一言以蔽之,regex_match函式要求被匹配字串與正規表示式完全匹配。
2.bool regex_search(seq,m,r,mft)
引數意義與regex_match一致。
該函式的功能是搜尋在指定字串中是否有指定與正規表示式匹配的子串行,例項:
string str="niulei2";
string pattern("[a-z]*");
regex r(pattern);
smatch result;
bool flag=regex_search(str,result,r);
cout<3.string regex_replace(dest,seq,r,fmt,mft)
其中seq是被替換字串,r是正規表示式,mft為控制資訊可有可無。dest是替換後的字串儲存位置,是string::iterator型別,如果預設則視為儲存在被替換符串中。最重要的是fmt,它決定了替換後的字串按什麼樣的格式儲存,下面給出例項:
string seq="2017-6-23";
string fmt="\$2.\$3.\$1";
string pattern="(\\d*)-(\\d*)-(\\d*)";
regex r(pattern);
string result;
string::iterator iter=result.begin();
regex_replace(iter,seq,r,fmt);
cout<4.sregex_iterator
這是一種正規表示式迭代器,可以看作regex庫給我們的額外福利,它類似於stl提供給我們的insert_iterator,後者是對insert操作進行了封裝,讓我們對插入迭代器進行簡單的賦值、自增等運算就能實現想要的插入操作。那麼sregex_iterator也是類似:對regex_search操作進行了封裝,它使用方法如下:
string seq;
auto b=seq.begin():
auto e=seq.end();
regex r;
sregex_iterator it(b,e,r);
b和e為string::iterator,r為正規表示式。這就繫結了r和與seq。初始化it的時候會對seq進行一次regex_search,通過++it或者it++可實現對seq的迴圈regex_search,匹配的結果儲存在*it中,*it為smatch型別,因此可通過it->str()來檢視匹配結果,另外它還過載了和!=操作符,可通過這兩個操作符判斷兩個sregex_iterator是否相等,如it1it2,it1!=it2;
下面給出例項:
string names="ross rachel monica joey chandller phoebe";
string pattern("[[:alpha:]]*");\\這就相當於[a-z a-z]*,之前嫌麻煩一直沒寫
regex r(pattern);
sregex_iterator it(names.begin(),names.end(),r);
sregex_iterator end_it;//空的,相當於結束符
for(;it!=end_it;++it)
cout 非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z... 1.獲取html標籤中的所有文字 string s regex.match scon,groups 1 value s 標題文字 string s1 regex.match scon,value s1 替換 system.text.regularexpressions.regex.replace s... 正規表示式用於操作字串的規則,這些規則由一些符號所組成。使用正規表示式可以進行更複雜的操作,而且這種複雜的操作要比方法短的多。功能 1,匹配。使用的是string類中的matches方法。2,切割。使用的string類split方法。3,替換。4,查詢。1,將正則規則通過pattern類中的stat...正規表示式 正規表示式 總結
C 正規表示式總結
正規表示式總結