摘要:文檔介紹楷體正則文法正則庫表示有一個正則表達式類,比如全文匹配,要求整個字符串符合正則表達式的匹配規則。能和正則表達式相匹配就返回替換匹配,即可以將符合匹配規則的子字符串替換為其他字符串。
一、為什么要學正則表達式
若要判斷一個輸入的QQ號是否有效,如何判斷?
判斷步驟:
C++string處理:
#include using namespace std;int main(){ string qq = "7466a2063"; if (qq.length() >= 5 && qq.length() <= 11) { // 2. 判斷是否非"0"開頭 if (qq[0] != "0") { // 3. 判斷是否為純數字 for each (char var in qq) { cout << var; if (var < "0" || var > "9") { cout << "不存在" << endl; return 0; } } cout << "存在" << endl; } else { cout << "不存在" << endl; } } else { cout << "不存在" << endl; } return 0;}
雖然功能實現了但是非常麻煩
#include #include using namespace std;int main(){ regex qq_reg("[1-9]//d{4,11}"); string qq = "746632063"; smatch result; bool ret = regex_match(qq, result, qq_reg); cout << (ret ? "存在" : "不存在") << endl; return 0;}
正則表達式只需幾行代碼就行了。
是不是很方便呢?那么接下來便來看看C++如何使用正則表達式
二、正則程序庫(regex)
C++11 新增了正則表達式的標準庫支持,本文簡介 C++ 正則表達式的使用:
std::regex是C++用來表示正則表達式(regular expression)的庫,它是class std::basic_regex<>針對char類型的一個特化,還有一個針對wchar_t類型的特化為std::wregex。
文檔介紹
正則文法:
正則庫:
regex
表示有一個正則表達式類,比如:regex pattern("(.{3})(.{2})_(/d{4})!")
regex_match
全文匹配,要求整個字符串符合正則表達式的匹配規則。用來判斷一個字符串和一個正則表達式是否模式匹配,返回一個 bool 值,true 為匹配,false 為不匹配。匹配的含義是目標字符串必須完全和正則表達式相匹配,不能有多余的字符,如果需要部分匹配則應使用regex_search
regex_search 搜索匹配,根據正則表達式來搜索字符串中是否存在符合規則的子字符串。 能和正則表達式相匹配就返回true
regex_replace
替換匹配,即可以將符合匹配規則的子字符串替換為其他字符串。要求輸入一個正則表達式,以及一個用于替換匹配子字符串的格式化字符串。這個格式化字符串可以通過轉義序列引用匹配子字符串中的部分內容
sregex_iterator
迭代器適配器,調用regex_search來遍歷一個string中所有匹配的子串
smatch/match_results
容器類,保存在string中搜索的結果。如果匹配成功,這些函數將成功匹配的相關信息保存在給定的smatch對象中。比如:smatch results;將匹配結果存放在results中,另一種存儲方法聲明:match_resultsstring::const_iterator result
匹配(Match)
字符串處理常用的一個操作是匹配,即字符串和規則恰好對應,而用于匹配的函數為std::regex_match(),它是個函數模板
bool regex_match(string s,regex pattern)
bool regex_match(string s,smatch result,regex pattern)
bool regex_match(s.cbegin()+i,s.cend(),smatch result,regex pattern)
參數s為要匹配的字符串,pattern為匹配規則,result保存結果s.cbegin()+i,s.cend()對應s的匹配s迭代器所取的范圍。
更多的時候我們希望能夠獲得匹配結果(字符串),對結果進行操作。這時就需要對匹配結果進行存儲,共有兩種存儲方式。
match_resultsstring::const_iterator result;
smatch result; //推薦
如果需要保存結果,可以用第二種函數,用smatch result保存結果。
通常result[0]保存整個匹配結果,result[i]保存第i個捕獲組的匹配結果,即模式中第i個括號的匹配結果。如果沒有這樣的結果則為空。
可以用result.size()查看一共有多少個匹配結果。
#include #include using namespace std;int main(){ string str = "Hello_2021"; smatch result; regex pattern("(.{5})_(//d{4})"); //匹配5個任意單字符 + 下劃線 + 4個數字 if (regex_match(str, result, pattern)) { cout << result[0] << endl; //完整匹配結果,Hello_2018 cout << result[1] << endl; //第一組匹配的數據,Hello cout << result[2] << endl; //第二組匹配的數據,2018 cout << "結果顯示形式2" << endl; cout << result.str() << endl; //完整結果,Hello_2018 cout << result.str(1) << endl; //第一組匹配的數據,Hello cout << result.str(2) << endl; //第二組匹配的數據,2018 } //遍歷結果 for (int i = 0; i < result.size(); ++i) { cout << result[i] << endl; }}
result結構為如下圖,result[0]為匹配的字符串,result[1]為Hello result[2]為2021
result[]與result.str()這兩種方式能夠獲得相同的值,我更喜歡用數組形式的。
在匹配規則中,以括號()的方式來劃分組別,實例中的規則共有兩個括號,所以共有兩組數據
搜索(Search)
搜索與匹配非常相像,其對應的函數為std::regex_search,也是個函數模板,用法和regex_match一樣,不同之處在于搜索只要字符串中有目標出現就會返回,而非完全匹配。
bool regex_search(string s,regex pattern)
bool regex_search(string s,smatch result,regex pattern)
bool regex_search(s.cbegin()+i,s.cend(),smatch result,regex pattern) //從字符串的某個位置開始匹配?
string str = "Hello 2018, Bye 2017";smatch result;regex pattern("http://d{4}"); //匹配四個數字//迭代器聲明string::const_iterator iterStart = str.begin();string::const_iterator iterEnd = str.end();string temp;while (regex_search(iterStart, iterEnd, result, pattern)){ temp = result[0]; cout << temp << " "; iterStart = result[0].second; //更新搜索起始位置,搜索剩下的字符串}輸出結果:2018 2017
搜索給定字符串中是否存在與模式匹配的子串,如果存在則返回true。
同樣可以用smatch result記錄結果,但不同的是result[0]記錄的是整個字符串中從左往右第一個匹配模式的子串。
假如有多個子串符合模式,若想知道result[0]中存儲的是第幾個子串,可以用result.position()函數,返回數從0開始。
替換(Replace)
replace是替換匹配,即可以將符合匹配規則的子字符串替換為其他字符串。
string regex_replace(string s,regex p,string replace_str)
string str = "Hello_2021!";regex pattern("Hello"); cout << regex_replace(str, pattern, "") << endl; cout << regex_replace(str, pattern, "Hi") << endl;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125068.html
摘要:我將上面校驗的正則表達式的第二部分后面加多了個號,即變成這樣這里加了個號這樣之后,運行原有的程序就沒有問題了。 正則表達式是程序員經常使用的工具之一。本文作者通過一個正則表達式的陷阱,先深入剖析了出現問題的原因,后給出怎么處理這類問題的方法。最后還給出了一些檢測常見正則表達式問題的工具,十分值得深入研究。前幾天線上一個項目監控信息突然報告異常,上到機器上后查看相關資源的使用情況,發現 CPU...
摘要:對于含有量詞正則表達式,量詞是貪婪模式,會優先選擇盡可能多的匹配修飾的字符,所以該表達式會優先選擇匹配一個字符,當匹配不到時再選擇不匹配字符。 正則表達式的語法 普通字符 字母、數字、漢字、下劃線以及一些沒有特殊定義的標點符號,都屬于普通字符,正則表達式中的普通字符匹配字符本身,如: var str = abced console.log(str.match(/a/)) // [a,...
摘要:大家好,今天屁孩君給大家帶來入門綜合。年,標準委員會發布了語言的第一個國際標準,該標準即為大名鼎鼎的。年,標準委員會發布了一份技術報告,詳細說明了計劃引入的新特性。年月日,經過標準委員投票,標準獲得一致通過。 ...
摘要:性能問題一般不會超過占整個項目性能的,一般在。內置函數的性能優劣。幾乎與在函數中調用局部變量的速度相當。遞增一個全局變量要比遞增一個局部變量慢倍。類似的方法調用所花費的時間接近于次的局部變量遞增操作。 php性能怎么優化?性能是網站運行是否良好的關鍵因素, 網站的性能與效率影響著公司的運營成本及長遠發展,編寫出高質高效的代碼是我們每個開發人員必備的素質,也是我們良好...
摘要:使用看完你就會正則表達式了四種操作驗證切分提取替換第一章正則表達式字符匹配攻略正則表達式是匹配模式,要么匹配字符,要么匹配位置至少,至多匹配中的任一個字符范圍表示法如果要匹配則要么要么要么通配符,表示幾乎任意 API 使用 String#search String#split String#match String#replace RegExp#test Reg...
閱讀 1702·2021-11-25 09:43
閱讀 2665·2019-08-30 15:53
閱讀 1808·2019-08-30 15:52
閱讀 2897·2019-08-29 13:56
閱讀 3316·2019-08-26 12:12
閱讀 565·2019-08-23 17:58
閱讀 2126·2019-08-23 16:59
閱讀 931·2019-08-23 16:21