最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++使用正則表達式的詳細教程

 更新時間:2022年05月26日 11:29:55   作者:葉光紀  
正則表達式是一個非常強大的工具,主要用于字符串匹配,下面這篇文章主要給大家介紹了關于C++使用正則表達式的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

正則表達式

正則表達式(regular expression)是一種描述字符序列的方法,是一種極其強大的計算工具。

C++正則表達式庫(RE庫)定義在<regex>中,它包含多個組件。

RE庫組件

 解釋
regex表示有一個正則表達式的類
regex_match將一個字符序列與一個正則表達式匹配
regex_search尋找第一個與正則表達式匹配的子序列
regex_replace使用給定格式替換一個正則表達式
sregex_iterator迭代器適配器,調(diào)用regex_search來遍歷一個string中所有匹配的子串
smatch容器類,保存在string中搜索的結(jié)果
ssub_matchstring中匹配的子表達式的結(jié)果

正則表達式的使用

#include <regex>
void test()
{
    //查找不是在字符c之后的ei組合存在的單詞
	string pattern("[^c]ei");
	pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";
	regex r(pattern);
	smatch results;
	string test_str("receipt freind theif receive");
	if (regex_search(test_str, results, r))
		cout << results.str() << endl;//freind
}

regex迭代器類型

上面的程序只能查找第一個匹配到的單詞,如果想獲得所有匹配,可以使用sregex_iterator。

for (sregex_iterator it(test_str.begin(),test_str.end(),r), end_it;it != end_it;++it) {
		cout << it->str() << endl;
}

輸出:

freind
theif

for循環(huán)中定義了兩個迭代器,it負責尋找匹配的單詞,end_it是一個空迭代器,起到尾后迭代器的作用。

解引用迭代器會得到一個匹配結(jié)果的smatch對象。

除了得到匹配的smatch對象以外,還可以得到其上下文。

for (sregex_iterator it(test_str.begin(),test_str.end(),r), end_it;it != end_it;++it) {
	auto pos = it->prefix().length();
	pos = pos > 40 ? pos - 40 : 0;
	cout << it->prefix().str().substr(pos)
		<< "[ " << it->str() << " ]"
		<< it->suffix().str().substr(0, 40)
		<< endl;
}

輸出:

receipt [ freind ] theif receive
 [ theif ] receive

使用prefix和suffix函數(shù)可以得到匹配之前和之后的ssub_match對象。

smatch相關操作

 解釋
m.ready()若已通過regex_search或regex_match設置了m,則返回true;否則返回false
m.size()如果匹配失敗,返回0;否則返回最近一次匹配的正則表達式中子表達式的數(shù)目
m.empty()若m.size()==0,返回true
m.prefix()一個ssub_match對象,表示當前匹配之前的序列
m.suffix()一個ssub_match對象,表示當前匹配之后的部分
m.format()格式化輸出
m.length(n)第n個匹配的子表達式的大小
m.position(n)第n個子表達式距序列開始的距離
m.str(n)第n個子表達式匹配的string
m[n]對應第n個子表達式的ssub_match對象
m.begin(),m.end()m中sub_match元素范圍的迭代器
m.cbegin(),m.cend()m中sub_match元素范圍的常量迭代器

這些操作也適用于cmatch、wsmatch、wcmatch和對應的子匹配對象。

子表達式

正則表達式中的模式通常包含一個或多個子表達式(subexpression)。

一個子表達式是模式的一部分,本身也具有意義。

正則表達式語法同常用小括號表示子表達式。

eg: 可以使用子表達式來匹配文件擴展名

regex r("([[:alnum:]]+)\\.(cpp|cxx|cc)$");

現(xiàn)在模式中有兩個小括號表示的子表達式:

  • ([[:alnum:]]+) 匹配一個或多個數(shù)字字母序列
  • (cpp|cxx|cc) 匹配cpp或cxx或cc等擴展名

通過使用str(n)來打印子表達式

if (regex_search(filename, results, r))
		cout << results.str(1) << endl;//打印第一個子表達式

參數(shù)0代表整個對應的匹配,參數(shù)1表示第一個子表達式。

如,foo.cpp中,results.str(0)將保存foo.cpp,results.str(1)將保存foo。

子表達式用于數(shù)據(jù)驗證

子表達式的一個常見用途是驗證必須匹配特定格式的數(shù)據(jù)。

eg:匹配聯(lián)通號碼

中國聯(lián)通號段:130、131、132、145、155、156、166、175、176、185、186、196

使用開源工具Regulex實現(xiàn)正則表達式設計可視化。

void test02()
{
	//匹配聯(lián)通號碼
	string UnicomNumber("\\b(1)(3[0-2]|[4578]5|[5-9]6)(\\d{4})(\\d{4})\\b");
	regex r(UnicomNumber);
	string testNumbers("130123456789 23112345678 7602125 1320000 16512345678 14512345678 17612345678");
	for (sregex_iterator it(testNumbers.begin(), testNumbers.end(), r), end_it;it != end_it;++it) {
		cout << it->str() << endl;	
	}
}

結(jié)果:

1451234567817612345678

解釋:

在模式UnicomNumber中,有4個子表達式

子表達式索引號子表達式含義
子表達式1(1)匹配1
子表達式2(3[0-2]|[4578]5|[5-9]6)匹配30/31/32/45/55/75/85/56/66/76/86/96
子表達式3(\d{4})匹配任意4個數(shù)字
子表達式4(\d{4})匹配任意4個數(shù)字

此外,"\b"匹配單詞邊界,可以理解為空格與單詞的分界線。"\d"匹配任意數(shù)字。[]內(nèi)表示多選一,{n}表示匹配n個,子表達式內(nèi)"|"表示或。

并且,在正則表達式語法中"\“具有轉(zhuǎn)義作用,在C++中也有轉(zhuǎn)義作用,因此,為了得到正則表達式中的”\",需要在string中額外加一個"\"。所以我們的表達式中會有"\\b"和"\\d"。

在正則匹配過程中,迭代器查找每一個號碼,進行分析

號碼分析
130123456789多了一位數(shù)字,單詞邊界匹配失敗
23112345678子表達式1匹配失敗
7602125子表達式1匹配失敗
1320000子表達式3匹配失敗(或者說是邊界匹配失?。?
16512345678子表達式2匹配失敗
14512345678匹配成功
17612345678匹配成功

子匹配操作

ssub_match的相關操作

 解釋
matched一個public bool成員,指出此ssub_match是否匹配了
first,secondpublic數(shù)據(jù)成員,指向匹配序列首元素和尾后迭代器
length()匹配的大小
str()匹配的string
s = ssub將ssub_match對象轉(zhuǎn)化為string對象

添加一段代碼,測試一下matched成員

for (sregex_iterator it(testNumbers.begin(), testNumbers.end(), r), end_it;it != end_it;++it) {
	cout << it->str() << endl;	
	cout << "\t" << (*it)[4].matched << endl;
}

結(jié)果

14512345678
        1
17612345678
        1

這里的matched為true表示匹配到了,當然,UnicomNumber的子表達式并非是可選匹配的(用"?"跟在一個表達式后表示可以有1個或0個該表達式),所以它的四個子表達式全部匹配到了,若是可選表達式,可能會出現(xiàn)matched為false的情況。

regex_replace

正則表達式不僅用在查找給定序列方面,當我們想將查找到的序列替換為另一個序列時,可使用regex_replace。

eg:格式化輸出電話號碼

void test03()
{
	string UnicomNumber("\\b(1)(3[0-2]|[4578]5|[5-9]6)(\\d{4})(\\d{4})\\b");
	regex r(UnicomNumber);
	string fmt = "$1$2 $3 $4";
	string number = "14512345678";
	cout << regex_replace(number,r,fmt) << endl;
}

結(jié)果:

145 1234 5678

解釋:

使用"$"后跟子表達式的索引號來表示一個特定的子表達式。

在"$1$2 $3 $4"中,希望子表達式1和2在一起,跟子表達式3和4之間都使用空格(" ")隔開。

參考資料

《C++ Primer 第5版》

總結(jié) 

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

相關文章

  • C++開發(fā)截屏小程序功能

    C++開發(fā)截屏小程序功能

    這篇文章主要介紹了C++開發(fā)截屏小程序功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • C語言實現(xiàn)類似wget的進度條效果

    C語言實現(xiàn)類似wget的進度條效果

    這篇文章主要介紹了C語言實現(xiàn)類似wget的進度條效果的方法,主要是讓大家可以熟練的使用轉(zhuǎn)移符\r,這里推薦給大家,需要的小伙伴參考下。
    2015-03-03
  • C/C++中比較字符串的方法詳解

    C/C++中比較字符串的方法詳解

    這篇文章主要介紹了C/C++中比較字符串的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#復制和深度復制的實現(xiàn)方法

    C#復制和深度復制的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狢#復制和深度復制的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C/C++實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    C/C++實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    在C/C++程序中,會需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實現(xiàn)程序想要的效果,下面將介紹多種方法實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • C語言?超詳細總結(jié)講解二叉樹的概念與使用

    C語言?超詳細總結(jié)講解二叉樹的概念與使用

    二叉樹可以簡單理解為對于一個節(jié)點來說,最多擁有一個上級節(jié)點,同時最多具備左右兩個下級節(jié)點的數(shù)據(jù)結(jié)構(gòu)。本文將詳細介紹一下C++中二叉樹的概念和結(jié)構(gòu),需要的可以參考一下
    2022-04-04
  • C++ Thread實現(xiàn)簡單的socket多線程通信

    C++ Thread實現(xiàn)簡單的socket多線程通信

    本文主要介紹了C++ Thread實現(xiàn)簡單的socket多線程通信,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 一起來學習C++中類的this指針以使用

    一起來學習C++中類的this指針以使用

    這篇文章主要為大家詳細介紹了C++中類的this指針以使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言入門之基礎知識詳解

    C語言入門之基礎知識詳解

    這篇文章主要介紹了C語言入門之基礎知識詳解,文中有非常詳細的C語言使用教程及相關基礎知識,對正在學習c語言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • C++線性時間的排序算法分析

    C++線性時間的排序算法分析

    這篇文章主要介紹了C++線性時間的排序算法分析,是非常經(jīng)典的非比較排序算法,對于C++程序員有很大的借鑒價值,需要的朋友可以參考下
    2014-08-08

最新評論

嘉善县| 万山特区| 突泉县| 鲜城| 沧州市| 韩城市| 克什克腾旗| 山东| 宁德市| 八宿县| 漳平市| 通山县| 安阳县| 宁远县| 敦煌市| 宣城市| 常山县| 岢岚县| 灵丘县| 巴里| 禹城市| 龙川县| 全椒县| 宁陵县| 同心县| 巴楚县| 巩义市| 连江县| 潞城市| 新建县| 鹤庆县| 枣阳市| 威宁| 四川省| 临汾市| 桃源县| 凉山| 准格尔旗| 清原| 丰城市| 松滋市|