亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++?正則表達(dá)式的應(yīng)用詳解

 更新時(shí)間:2021年11月25日 10:17:02   作者:自首的小偷  
正則表達(dá)式(regular?expression)描述了一種字符串匹配的模式(pattern),可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等

一、為什么要學(xué)正則表達(dá)式

若要判斷一個(gè)輸入的QQ號(hào)是否有效,如何判斷?

判斷步驟:

  • 長(zhǎng)度大于5,小于等于10;
  • 首位不能為0;
  • 是否為純數(shù)字?

C++string處理:

#include<iostream>
using namespace std;
int main()
{
    string qq = "7466a2063";
    if (qq.length() >= 5 && qq.length() <= 11)
    {
        // 2. 判斷是否非'0'開(kāi)頭
        if (qq[0] != '0')
        {
            // 3. 判斷是否為純數(shù)字
            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;
}

雖然功能實(shí)現(xiàn)了但是非常麻煩

#include<iostream>
#include<regex>
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;
}

正則表達(dá)式只需幾行代碼就行了。

是不是很方便呢?那么接下來(lái)便來(lái)看看C++如何使用正則表達(dá)式

二、正則程序庫(kù)(regex)

C++11 新增了正則表達(dá)式的標(biāo)準(zhǔn)庫(kù)支持,本文簡(jiǎn)介 C++ 正則表達(dá)式的使用: std::regex是C++用來(lái)表示正則表達(dá)式(regular expression)的庫(kù),它是class std::basic_regex<>針對(duì)char類型的一個(gè)特化,還有一個(gè)針對(duì)wchar_t類型的特化為std::wregex。文檔介紹

正則文法:

正則庫(kù):

regex

表示有一個(gè)正則表達(dá)式類,比如:regex pattern("(.{3})(.{2})_(\d{4})!")

regex_match

全文匹配,要求整個(gè)字符串符合正則表達(dá)式的匹配規(guī)則。用來(lái)判斷一個(gè)字符串和一個(gè)正則表達(dá)式是否模式匹配,返回一個(gè) bool 值,true 為匹配,false 為不匹配。匹配的含義是目標(biāo)字符串必須完全和正則表達(dá)式相匹配,不能有多余的字符,如果需要部分匹配則應(yīng)使用regex_search regex_search 搜索匹配,根據(jù)正則表達(dá)式來(lái)搜索字符串中是否存在符合規(guī)則的子字符串。 能和正則表達(dá)式相匹配就返回true

regex_replace

替換匹配,即可以將符合匹配規(guī)則的子字符串替換為其他字符串。要求輸入一個(gè)正則表達(dá)式,以及一個(gè)用于替換匹配子字符串的格式化字符串。這個(gè)格式化字符串可以通過(guò)轉(zhuǎn)義序列引用匹配子字符串中的部分內(nèi)容

sregex_iterator

迭代器適配器,調(diào)用regex_search來(lái)遍歷一個(gè)string中所有匹配的子串

smatch/match_results

容器類,保存在string中搜索的結(jié)果。如果匹配成功,這些函數(shù)將成功匹配的相關(guān)信息保存在給定的smatch對(duì)象中。比如:smatch results;將匹配結(jié)果存放在results中,另一種存儲(chǔ)方法聲明:match_resultsstring::const_iterator result

匹配(Match)

字符串處理常用的一個(gè)操作是匹配,即字符串和規(guī)則恰好對(duì)應(yīng),而用于匹配的函數(shù)為std::regex_match(),它是個(gè)函數(shù)模板

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)

參數(shù)s為要匹配的字符串,pattern為匹配規(guī)則,result保存結(jié)果s.cbegin()+i,s.cend()對(duì)應(yīng)s的匹配s迭代器所取的范圍。

更多的時(shí)候我們希望能夠獲得匹配結(jié)果(字符串),對(duì)結(jié)果進(jìn)行操作。這時(shí)就需要對(duì)匹配結(jié)果進(jìn)行存儲(chǔ),共有兩種存儲(chǔ)方式。

match_resultsstring::const_iterator result;

smatch result; //推薦

如果需要保存結(jié)果,可以用第二種函數(shù),用smatch result保存結(jié)果。通常result[0]保存整個(gè)匹配結(jié)果,result[i]保存第i個(gè)捕獲組的匹配結(jié)果,即模式中第i個(gè)括號(hào)的匹配結(jié)果。如果沒(méi)有這樣的結(jié)果則為空。可以用result.size()查看一共有多少個(gè)匹配結(jié)果。

#include<iostream>
#include<regex>
using namespace std;
int main()
{
	string str = "Hello_2021";
	smatch result;
	regex pattern("(.{5})_(\\d{4})");	//匹配5個(gè)任意單字符 + 下劃線 + 4個(gè)數(shù)字

	if (regex_match(str, result, pattern))
	{
		cout << result[0] << endl;		//完整匹配結(jié)果,Hello_2018
		cout << result[1] << endl;		//第一組匹配的數(shù)據(jù),Hello
		cout << result[2] << endl;		//第二組匹配的數(shù)據(jù),2018
		cout << "結(jié)果顯示形式2" << endl;
		cout << result.str() << endl;	//完整結(jié)果,Hello_2018
		cout << result.str(1) << endl;	//第一組匹配的數(shù)據(jù),Hello
		cout << result.str(2) << endl;	//第二組匹配的數(shù)據(jù),2018
	}

	//遍歷結(jié)果
	for (int i = 0; i < result.size(); ++i)
	{
		cout << result[i] << endl;
	}

}

result結(jié)構(gòu)為如下圖,result[0]為匹配的字符串,result[1]為Hello result[2]為2021

result[]與result.str()這兩種方式能夠獲得相同的值,我更喜歡用數(shù)組形式的。在匹配規(guī)則中,以括號(hào)()的方式來(lái)劃分組別,實(shí)例中的規(guī)則共有兩個(gè)括號(hào),所以共有兩組數(shù)據(jù)

搜索(Search)

搜索與匹配非常相像,其對(duì)應(yīng)的函數(shù)為std::regex_search,也是個(gè)函數(shù)模板,用法和regex_match一樣,不同之處在于搜索只要字符串中有目標(biāo)出現(xiàn)就會(huì)返回,而非完全匹配。

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) //從字符串的某個(gè)位置開(kāi)始匹配?

string str = "Hello 2018, Bye 2017";
smatch result;
regex pattern("\\d{4}");	//匹配四個(gè)數(shù)字

//迭代器聲明
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;	//更新搜索起始位置,搜索剩下的字符串
}

輸出結(jié)果:2018 2017

搜索給定字符串中是否存在與模式匹配的子串,如果存在則返回true。

同樣可以用smatch result記錄結(jié)果,但不同的是result[0]記錄的是整個(gè)字符串中從左往右第一個(gè)匹配模式的子串。

假如有多個(gè)子串符合模式,若想知道result[0]中存儲(chǔ)的是第幾個(gè)子串,可以用result.position()函數(shù),返回?cái)?shù)從0開(kāi)始。

替換(Replace)

replace是替換匹配,即可以將符合匹配規(guī)則的子字符串替換為其他字符串。

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;	

到此這篇關(guān)于C++ 正則表達(dá)式的應(yīng)用詳解的文章就介紹到這了,更多相關(guān)C++ 正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vc控制臺(tái)程序關(guān)閉事件時(shí)的處理方式及注意點(diǎn)詳解

    vc控制臺(tái)程序關(guān)閉事件時(shí)的處理方式及注意點(diǎn)詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于vc控制臺(tái)程序關(guān)閉事件時(shí)的正確處理方式的相關(guān)知識(shí)點(diǎn)內(nèi)容,對(duì)此有需求的朋友們可以參閱下。
    2021-12-12
  • C語(yǔ)言實(shí)現(xiàn)計(jì)算樹的深度的方法

    C語(yǔ)言實(shí)現(xiàn)計(jì)算樹的深度的方法

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)計(jì)算樹的深度的方法,針對(duì)數(shù)據(jù)結(jié)構(gòu)中樹進(jìn)行操作的方法,在算法設(shè)計(jì)中比較常見(jiàn),需要的朋友可以參考下
    2014-09-09
  • C/C++中的?Qt?StandardItemModel?數(shù)據(jù)模型應(yīng)用解析

    C/C++中的?Qt?StandardItemModel?數(shù)據(jù)模型應(yīng)用解析

    QStandardItemModel?是標(biāo)準(zhǔn)的以項(xiàng)數(shù)據(jù)為單位的基于M/V模型的一種標(biāo)準(zhǔn)數(shù)據(jù)管理方式,本文給大家介紹C/C++中的?Qt?StandardItemModel?數(shù)據(jù)模型應(yīng)用解析,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • C語(yǔ)言指針用法總結(jié)

    C語(yǔ)言指針用法總結(jié)

    本文詳細(xì)講解了C語(yǔ)言指針用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • VSCode如何使用最新的C++20(推薦)

    VSCode如何使用最新的C++20(推薦)

    這篇文章主要介紹了VSCode使用最新的C++20的相關(guān)知識(shí),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C語(yǔ)言快速掌握位段使用

    C語(yǔ)言快速掌握位段使用

    位段位段的聲明和結(jié)構(gòu)是類似的,但是也會(huì)有所不同,此篇文章將帶你了解位段是什么已以及位段的使用和位段的特性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • 詳解C++11中綁定器bind的原理與使用

    詳解C++11中綁定器bind的原理與使用

    C++11中引入的function機(jī)制,其中綁定器主要有三種:bind1st、bind2nd、bind(C++11)。本文就來(lái)和大家聊聊這些綁定器的底層實(shí)現(xiàn)原理與使用場(chǎng)景,需要的可以參考一下
    2022-12-12
  • C語(yǔ)言實(shí)現(xiàn)翻譯功能

    C語(yǔ)言實(shí)現(xiàn)翻譯功能

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的翻譯功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 淺析C++11新特性的Lambda表達(dá)式

    淺析C++11新特性的Lambda表達(dá)式

    C++11 新增了很多特性,lambda 表達(dá)式是其中之一,本文涉及到C++11這次更新中較為重要的lambda表達(dá)式。有需要的朋友們可以參考學(xué)習(xí)。
    2016-08-08
  • C語(yǔ)言文件操作詳情(一)

    C語(yǔ)言文件操作詳情(一)

    這篇文章主要介紹了C語(yǔ)言文件操作詳情,主要討論的是數(shù)據(jù)文件,通過(guò)處理的磁盤上的文件展開(kāi)主題內(nèi)容介紹,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-04-04

最新評(píng)論