欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中正則表達(dá)式的使用方法詳解

 更新時(shí)間:2022年05月11日 11:32:22   作者:求則得之,舍則失之  
幾乎所有的編程語(yǔ)言都支持正則表達(dá)式。 C++從C++11開始直接支持正則表達(dá)式。除了編程語(yǔ)言之外,大多數(shù)文本處理程序都使用正則表達(dá)式。本文將探討正則表達(dá)式的一般細(xì)節(jié)以及C++編程方面的細(xì)節(jié),感興趣的可以學(xué)習(xí)一下

介紹

C++ 正則表達(dá)式教程解釋了 C++ 中正則表達(dá)式的工作,包括正則表達(dá)式匹配、搜索、替換、輸入驗(yàn)證和標(biāo)記化的功能。

幾乎所有的編程語(yǔ)言都支持正則表達(dá)式。 C++ 從 C++11 開始直接支持正則表達(dá)式。除了編程語(yǔ)言之外,大多數(shù)文本處理程序(如詞法分析器、高級(jí)文本編輯器等)都使用正則表達(dá)式。

在本教程中,我們將探討正則表達(dá)式的一般細(xì)節(jié)以及 C++ 編程方面的細(xì)節(jié)。

正則匹配中的基礎(chǔ)符號(hào)

  • ^開頭
  • ()組
  • []或,
  • {}幾次
  • $結(jié)尾

1. C++ 中的正則表達(dá)式 (Regex)

正則表達(dá)式是包含一系列字符的表達(dá)式,這些字符定義了可用于字符串搜索算法、查找或查找/替換算法等的特定搜索模式。正則表達(dá)式也用于輸入驗(yàn)證。

大多數(shù)編程語(yǔ)言要么為正則表達(dá)式提供內(nèi)置功能,要么通過(guò)庫(kù)提供。從 C++11 開始,C++ 通過(guò) 標(biāo)準(zhǔn)庫(kù)提供正則表達(dá)式支持。

用于解析正則表達(dá)式的正則表達(dá)式處理器將其轉(zhuǎn)換為內(nèi)部表示,該表示被執(zhí)行并與表示正在搜索的文本的字符串匹配。 C++11 使用 ECMAScript 語(yǔ)法作為正則表達(dá)式的默認(rèn)語(yǔ)法。 ECMAScript 很簡(jiǎn)單,但它提供了強(qiáng)大的正則表達(dá)式功能。 讓我們看看我們?cè)谡齽t表達(dá)式中指定的一些模式,如范圍規(guī)范、重復(fù)模式等。

1.1 范圍規(guī)范

指定字符或文字的范圍是正則表達(dá)式中使用的最簡(jiǎn)單的標(biāo)準(zhǔn)之一。

例如,我們可以指定一個(gè)從a到z的小寫字母范圍,如下所示:[a-z],這將只匹配一個(gè)小寫字符。

下列條件:[A-Za-z0-9]

上面的表達(dá)式指定了包含一個(gè)大寫字母、一個(gè)小寫字母和0到9之間的數(shù)字的范圍。

上述表達(dá)式中的方括號(hào)([])具有特殊含義,即用于指定范圍。如果你想包含一個(gè)括號(hào)作為表達(dá)式的一部分,那么你需要轉(zhuǎn)義它。

那么下面的表達(dá)式,[\[0-9]

上面的表達(dá)式表示一個(gè)左括號(hào)和一個(gè)0到9范圍內(nèi)的數(shù)字作為正則表達(dá)式。

但請(qǐng)注意,當(dāng)我們使用 C++ 編程時(shí),我們需要使用 C++ 特定的轉(zhuǎn)義序列,如下所示:[\\[0-9]

1.2 重復(fù)模式

我們上面指定的范圍示例只匹配一個(gè)字符或文字。如果我們想匹配多個(gè)字符,我們通常在模式中指定“表達(dá)式修飾符”,從而使其成為一個(gè)重復(fù)的模式。

表達(dá)式修飾符可以是+,表示匹配一個(gè)模式出現(xiàn)一次或多次,也可以是*,表示匹配一個(gè)模式出現(xiàn)零次或多次。

例如,下面的表達(dá)式,

[a-z]+ 匹配 a、aaa、abcd、softwaretestinghelp 等字符串。請(qǐng)注意,它永遠(yuǎn)不會(huì)匹配空白字符串。

[a-z]*將匹配一個(gè)空白字符串或任何上面的字符串。

如果要指定一組字符匹配一次或多次,則可以使用括號(hào),如下所示:(Xyz)+

上面的表達(dá)式將匹配Xyz、XyzXyz和XyzXyz等等。

2. C++正則表達(dá)式的例子

考慮一個(gè)匹配 MS-DOS 文件名的正則表達(dá)式,如下所示。

char regex_filename[] = “[a-zA-Z_] [a-zA-Z_0-9]*\\.[a-zA-Z0-9]+”;

上面的正則表達(dá)式可以解釋如下:

匹配一個(gè)字母(小寫,然后大寫)或下劃線。然后匹配零個(gè)或多個(gè)字符,其中每個(gè)字符可以是字母、下劃線或數(shù)字。然后匹配文字點(diǎn)(.)。在點(diǎn)之后,匹配一個(gè)或多個(gè)字符,其中每個(gè)字符可以是表示文件擴(kuò)展名的字母或數(shù)字。

3. C++正則表達(dá)式中使用的函數(shù)模板

現(xiàn)在讓我們討論在 C++ 中編寫正則表達(dá)式時(shí)的一些重要函數(shù)模板。

3.1 regex_match()

此函數(shù)模板用于匹配給定的模式。如果給定的表達(dá)式與字符串匹配,則此函數(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;  //匹配的詞語(yǔ)檢索出來(lái)
   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 "與正則表達(dá)式" (soft)(.*) "匹配。隨后,我們還通過(guò)向regex_match傳遞字符串對(duì)象、范圍等來(lái)演示regex_match的不同變體。

3.2 regex_search()

函數(shù)regex_search()用于在字符串中搜索匹配正則表達(dá)式的模式。

考慮下面的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; 
}

我們先指定一個(gè)字符串,然后使用regex對(duì)象指定一個(gè)正則表達(dá)式。這個(gè)字符串和regex連同smatch標(biāo)志類型一起被傳遞給regex_search函數(shù)。該函數(shù)在輸入字符串中搜索第一個(gè)出現(xiàn)的模式,并返回匹配的字符串。

3.3 regex_replace()

函數(shù)regex_replace()用于用字符串替換與正則表達(dá)式匹配的模式。

讓我們使用一個(gè)c++程序來(lái)演示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; 
}

這里,我們有一個(gè)輸入字符串。我們提供了一個(gè)正則表達(dá)式來(lái)匹配以 p 開頭的字符串。然后我們將匹配的單詞替換為website。接下來(lái),我們將website替換回portal。

4.C++輸入驗(yàn)證

我們已經(jīng)討論了使用regex進(jìn)行模式匹配的主要函數(shù)模板。值得注意的是,regex服務(wù)的主要目的是輸入驗(yàn)證??梢允褂胷egex表達(dá)式驗(yàn)證從標(biāo)準(zhǔn)輸入設(shè)備輸入的輸入。

檢查下面的程序,以演示如何使用regex驗(yàn)證傳入的數(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;}
    }
}

這個(gè)程序匹配用戶輸入的輸入,以驗(yàn)證它是否是整數(shù)。上面的輸出顯示,當(dāng)輸入一個(gè)整數(shù)時(shí),它會(huì)給出一個(gè)適當(dāng)?shù)南ⅲ?dāng)輸入任何其他數(shù)據(jù)時(shí),它會(huì)將該消息作為無(wú)效輸入。

5.總結(jié)

Regex在搜索引擎中用于搜索模式,搜索和替換應(yīng)用程序的對(duì)話框,如字處理器和文本編輯器。Regex也用于UNIX實(shí)用程序,如sed、awk以及程序的詞法分析。

在本教程中,我們已經(jīng)看到了用于匹配、搜索和替換模式的函數(shù)。使用這些函數(shù),我們基本上可以開發(fā)一個(gè)高效的應(yīng)用程序,使用regex實(shí)現(xiàn)所需的功能。

Regex允許通過(guò)修補(bǔ)模式有效地驗(yàn)證輸入或搜索并替換字符串,這可以使用很少的行來(lái)完成。

以上就是C++中正則表達(dá)式的使用方法詳解的詳細(xì)內(nèi)容,更多關(guān)于C++正則表達(dá)式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

    鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將用C語(yǔ)言實(shí)現(xiàn)單鏈表,需要的可以參考一下
    2022-06-06
  • C和指針小結(jié)(推薦)

    C和指針小結(jié)(推薦)

    下面小編就為大家?guī)?lái)一篇C和指針小結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • C語(yǔ)言金幣陣列問(wèn)題解決方法

    C語(yǔ)言金幣陣列問(wèn)題解決方法

    這篇文章主要介紹了C語(yǔ)言金幣陣列問(wèn)題解決方法,主要涉及數(shù)組的靈活運(yùn)算,是一類非常經(jīng)典的算法,需要的朋友可以參考下
    2014-09-09
  • 最新評(píng)論