之前用正則表達(dá)式都是用的其他框架的類,比如QT的,并沒有用過標(biāo)準(zhǔn)庫里面的正則表達(dá)式,今日偶然得知c++11里面已經(jīng)添加了對(duì)正則表達(dá)式的支持,這絕對(duì)是一件大好事,如此強(qiáng)大的正則終于可以不依賴于其他的東西就可以用了,故來學(xué)習(xí)一下如何使用.
首先是要引入正則對(duì)應(yīng)的頭文件 #include <regex>
然后就可以聲明正則表達(dá)式對(duì)應(yīng)的類了
比如 std::regex re ("//d+?");
這里是說 匹配至少一個(gè)數(shù)字
用正則的話,我一般是使用三個(gè)用途
1.判斷某字符串是否符合要求,標(biāo)準(zhǔn)庫的用法如下:
std::regex re ("//d+?");std::string str = "12q3";bool ismatch = regex_match(str, re);
這里的ismatch 結(jié)果為false;但若是str = "123";,則返回結(jié)果為true
也就是 判斷是否符合要求,只需要使用 regex_match 這個(gè)函數(shù),傳字符串和對(duì)應(yīng)的正則規(guī)則,然后返回值的結(jié)果就是布爾類型,使用非常方便.
2.批量提取符合條件的字符串
比如我的字符串如下,std::string = "d45df544sf";我需要將其中的數(shù)字全部提取出來,則代碼如下:
std::regex re("//d+");std::string str = "d45df544sf";std::smatch sm;while (regex_search(str, sm, re)) {for (int i = 0; i < sm.size(); ++i)std::cout << sm[i] << " ";std::cout << std:: endl;str = sm.suffix().str();}
這里使用while循環(huán)來重復(fù)匹配 達(dá)到查找全部符合規(guī)則的字符串.
此外 還可以使用迭代器的寫法來進(jìn)行提取 代碼如下:
std::regex re("//d+");std::string str = "d45df544sf";for (std::sregex_iterator i = std::sregex_iterator(str.begin(), str.end(), re); i != std::sregex_iterator(); ++i){std::cout << i->str() << '/n';}
也能達(dá)到相同的結(jié)果 都是輸出 45 544
3.進(jìn)行字符串替換
替換使用的函數(shù)是regex_replace 用法如下
std::regex re ("//d+");std::string str = "12a3";std::string str2 = regex_replace(str,re,std::string("w"));
這里實(shí)現(xiàn)的效果就是將連續(xù)的數(shù)字全部替換成w str2的結(jié)果為waw
替換的使用方式與判斷是否符合規(guī)則類似 只是在最后多傳一個(gè)要替換為的字符串 然后返回替換后的字符串.
總體來說,標(biāo)準(zhǔn)庫的正則表達(dá)式的使用我認(rèn)為是非常方便的,能滿足日常的基本需求.
關(guān)于正則表達(dá)式的入門資料,推薦http://deerchao.net/tutorials/regex/regex.htm
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注