C++中正則表達式的使用方法詳解
介紹
C++ 正則表達式教程解釋了 C++ 中正則表達式的工作,包括正則表達式匹配、搜索、替換、輸入驗證和標記化的功能。
幾乎所有的編程語言都支持正則表達式。 C++ 從 C++11 開始直接支持正則表達式。除了編程語言之外,大多數(shù)文本處理程序(如詞法分析器、高級文本編輯器等)都使用正則表達式。
在本教程中,我們將探討正則表達式的一般細節(jié)以及 C++ 編程方面的細節(jié)。
正則匹配中的基礎(chǔ)符號
- ^開頭
- ()組
- []或,
- {}幾次
- $結(jié)尾
1. C++ 中的正則表達式 (Regex)
正則表達式是包含一系列字符的表達式,這些字符定義了可用于字符串搜索算法、查找或查找/替換算法等的特定搜索模式。正則表達式也用于輸入驗證。
大多數(shù)編程語言要么為正則表達式提供內(nèi)置功能,要么通過庫提供。從 C++11 開始,C++ 通過 標準庫提供正則表達式支持。
用于解析正則表達式的正則表達式處理器將其轉(zhuǎn)換為內(nèi)部表示,該表示被執(zhí)行并與表示正在搜索的文本的字符串匹配。 C++11 使用 ECMAScript 語法作為正則表達式的默認語法。 ECMAScript 很簡單,但它提供了強大的正則表達式功能。 讓我們看看我們在正則表達式中指定的一些模式,如范圍規(guī)范、重復(fù)模式等。
1.1 范圍規(guī)范
指定字符或文字的范圍是正則表達式中使用的最簡單的標準之一。
例如,我們可以指定一個從a到z的小寫字母范圍,如下所示:[a-z],這將只匹配一個小寫字符。
下列條件:[A-Za-z0-9]
上面的表達式指定了包含一個大寫字母、一個小寫字母和0到9之間的數(shù)字的范圍。
上述表達式中的方括號([])具有特殊含義,即用于指定范圍。如果你想包含一個括號作為表達式的一部分,那么你需要轉(zhuǎn)義它。
那么下面的表達式,[\[0-9]
上面的表達式表示一個左括號和一個0到9范圍內(nèi)的數(shù)字作為正則表達式。
但請注意,當我們使用 C++ 編程時,我們需要使用 C++ 特定的轉(zhuǎn)義序列,如下所示:[\\[0-9]
1.2 重復(fù)模式
我們上面指定的范圍示例只匹配一個字符或文字。如果我們想匹配多個字符,我們通常在模式中指定“表達式修飾符”,從而使其成為一個重復(fù)的模式。
表達式修飾符可以是+,表示匹配一個模式出現(xiàn)一次或多次,也可以是*,表示匹配一個模式出現(xiàn)零次或多次。
例如,下面的表達式,
[a-z]+ 匹配 a、aaa、abcd、softwaretestinghelp 等字符串。請注意,它永遠不會匹配空白字符串。
[a-z]*將匹配一個空白字符串或任何上面的字符串。
如果要指定一組字符匹配一次或多次,則可以使用括號,如下所示:(Xyz)+
上面的表達式將匹配Xyz、XyzXyz和XyzXyz等等。
2. C++正則表達式的例子
考慮一個匹配 MS-DOS 文件名的正則表達式,如下所示。
char regex_filename[] = “[a-zA-Z_] [a-zA-Z_0-9]*\\.[a-zA-Z0-9]+”;
上面的正則表達式可以解釋如下:
匹配一個字母(小寫,然后大寫)或下劃線。然后匹配零個或多個字符,其中每個字符可以是字母、下劃線或數(shù)字。然后匹配文字點(.)。在點之后,匹配一個或多個字符,其中每個字符可以是表示文件擴展名的字母或數(shù)字。
3. C++正則表達式中使用的函數(shù)模板
現(xiàn)在讓我們討論在 C++ 中編寫正則表達式時的一些重要函數(shù)模板。
3.1 regex_match()
此函數(shù)模板用于匹配給定的模式。如果給定的表達式與字符串匹配,則此函數(shù)返回 true。否則,該函數(shù)返回 false。
以下是演示 regex_match 函數(shù)的 C++ 編程示例。
#include <iostream> #include <string> #include <regex> using namespace std; int main () { if (regex_match ("softwareTesting", regex("(soft)(.*)") )) cout << "string:literal => matched\n"; const char mystr[] = "SoftwareTestingHelp"; string str ("software"); regex str_expr ("(soft)(.*)"); if (regex_match (str,str_expr)) cout << "string:object => matched\n"; if ( regex_match ( str.begin(), str.end(), str_expr ) ) cout << "string:range(begin-end)=> matched\n"; cmatch cm; //匹配的詞語檢索出來 regex_match (mystr,cm,str_expr); smatch sm; regex_match (str,sm,str_expr); regex_match ( str.cbegin(), str.cend(), sm, str_expr); cout << "String:range, size:" << sm.size() << " matches\n"; regex_match ( mystr, cm, str_expr, regex_constants::match_default ); cout << "the matches are: "; for (unsigned i=0; i<sm.size(); ++i) { cout << "[" << sm[i] << "] "; } cout << endl; return 0; }
在上面的程序中,首先,我們使用regex_match函數(shù)將字符串" softwareTesting "與正則表達式" (soft)(.*) "匹配。隨后,我們還通過向regex_match傳遞字符串對象、范圍等來演示regex_match的不同變體。
3.2 regex_search()
函數(shù)regex_search()用于在字符串中搜索匹配正則表達式的模式。
考慮下面的c++程序,它顯示了regex_search()的用法。
#include <iostream> #include <regex> #include<string.h> using namespace std; int main() { //string to be searched string mystr = "She sells_sea shells in the sea shore"; // regex expression for pattern to be searched regex regexp("s[a-z_]+"); // flag type for determining the matching behavior (in this case on string objects) smatch m; // regex_search that searches pattern regexp in the string mystr regex_search(mystr, m, regexp); cout<<"String that matches the pattern:"<<endl; for (auto x : m) cout << x << " "; return 0; }
我們先指定一個字符串,然后使用regex對象指定一個正則表達式。這個字符串和regex連同smatch標志類型一起被傳遞給regex_search函數(shù)。該函數(shù)在輸入字符串中搜索第一個出現(xiàn)的模式,并返回匹配的字符串。
3.3 regex_replace()
函數(shù)regex_replace()用于用字符串替換與正則表達式匹配的模式。
讓我們使用一個c++程序來演示regex_replace()函數(shù)。
#include <iostream> #include <string> #include <regex> #include <iterator> using namespace std; int main() { string mystr = "This is software testing Help portal \n"; cout<<"Input string: "<<mystr<<endl; // regex to match string beginning with 'p' regex regexp("p[a-zA-z]+"); cout<<"Replace the word 'portal' with word 'website' : "; // regex_replace() for replacing the match with the word 'website' cout << regex_replace(mystr, regexp, "website"); string result; cout<<"Replace the word 'website' back to 'portal': "; // regex_replace( ) for replacing the match back with 'portal' regex_replace(back_inserter(result), mystr.begin(), mystr.end(), regexp, "portal"); cout << result; return 0; }
這里,我們有一個輸入字符串。我們提供了一個正則表達式來匹配以 p 開頭的字符串。然后我們將匹配的單詞替換為website。接下來,我們將website替換回portal。
4.C++輸入驗證
我們已經(jīng)討論了使用regex進行模式匹配的主要函數(shù)模板。值得注意的是,regex服務(wù)的主要目的是輸入驗證??梢允褂胷egex表達式驗證從標準輸入設(shè)備輸入的輸入。
檢查下面的程序,以演示如何使用regex驗證傳入的數(shù)據(jù)。
#include <iostream> #include <regex> #include <string> using namespace std; int main() { string input; regex integer_expr("(\\+|-)?[[:digit:]]+"); //As long as the input is correct ask for another number while(true) { cout<<"Enter the input: "; cin>>input; if(!cin) break; //Exit when the user inputs q if(input=="q") break; if(regex_match(input,integer_expr)) cout<<"Input is an integer"<<endl; else {cout<<"Invalid input : Not an integer"<<endl;} } }
這個程序匹配用戶輸入的輸入,以驗證它是否是整數(shù)。上面的輸出顯示,當輸入一個整數(shù)時,它會給出一個適當?shù)南?,而當輸入任何其他?shù)據(jù)時,它會將該消息作為無效輸入。
5.總結(jié)
Regex在搜索引擎中用于搜索模式,搜索和替換應(yīng)用程序的對話框,如字處理器和文本編輯器。Regex也用于UNIX實用程序,如sed、awk以及程序的詞法分析。
在本教程中,我們已經(jīng)看到了用于匹配、搜索和替換模式的函數(shù)。使用這些函數(shù),我們基本上可以開發(fā)一個高效的應(yīng)用程序,使用regex實現(xiàn)所需的功能。
Regex允許通過修補模式有效地驗證輸入或搜索并替換字符串,這可以使用很少的行來完成。
以上就是C++中正則表達式的使用方法詳解的詳細內(nèi)容,更多關(guān)于C++正則表達式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何將Spire.PDF for C++集成到C++程序中
Spire.PDF for C++ 是一個專業(yè)的 PDF 庫,供開發(fā)人員在任何類型的 C++ 應(yīng)用程序中閱讀、創(chuàng)建、編輯和轉(zhuǎn)換 PDF 文檔,本文主要介紹了兩種不同的方式將 Spire.PDF for C++ 集成到您的 C++ 應(yīng)用程序中,希望對大家有所幫助2023-11-11C++?反匯編之關(guān)于Switch語句的優(yōu)化措施
這篇文章主要介紹了C++?反匯編之關(guān)于Switch語句的優(yōu)化措施,利用三種優(yōu)化來降低樹高度,誰的效率高就優(yōu)先使用誰,三種優(yōu)化都無法匹配才會使用判定樹,具體內(nèi)容詳情跟隨小編一起看看吧2022-01-01C++的get()函數(shù)與getline()函數(shù)使用詳解
這篇文章主要介紹了C++的get()函數(shù)與getline()函數(shù)使用詳解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09C++ 學(xué)習(xí)筆記實戰(zhàn)寫一個簡單的線程池示例
這篇文章主要為大家介紹了C++實現(xiàn)一個簡單的線程池學(xué)習(xí)實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10

C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)