c++ 正則表達式簡單運用

#include<regex>
1. “.”: 匹配除"\n"之外的任何單個字符,若要匹配包括"\n"在內的任意字符,需使用諸如"[\s\S]"之類的模式;
 2.“^”:匹配輸入字符串的開始位置,不匹配任何字符,要匹配”^”字符本身,需使用”\^”;
 3.“$”:匹配輸入字符串結尾的位置,不匹配任何字符,要匹配”$”字符本身,需使用”\$”;
 4.“*”: 零次或多次匹配前面的字符或子表達式,”*”等效於”{0,}”,如”\^*b”可以匹配”b”、”^b”、”^^b”、…;
 5.“+”: 一次或多次匹配前面的字符或子表達式,等效於”{1,}”,如”a+b”可以匹配”ab”、”aab”、”aaab”、…;
 6.“?”: 零次或一次匹配前面的字符或子表達式,等效於”{0,1}”,如”a[cd]?”可以匹配”a”、”ac”、”ad”; 當此字符緊隨任何其他限定符”*”、”+”、”?”、”{n}”、”{n,}”、”{n,m}”之後時,匹配模式是"非貪心的"。"非貪心的"模式匹配搜索到的、儘可能短的字符串,而默認的"貪心的"模式匹配搜索到的、儘可能長的字符串。如,在字符串"oooo"中,"o+?"只匹配單個"o",而"o+"匹配所有"o";
 7.“|”:將兩個匹配條件進行邏輯"或"(Or)運算,如正則表達式”(him|her)”匹配"itbelongs to him"和"it belongs to her",但是不能匹配"itbelongs to them.";
 8.“\”: 將下一字符標記爲特殊字符、文本、反向引用或八進制轉義符,如,”n”匹配字符”n”,”\n”匹配換行符,序列”\\”匹配”\”,”\(“匹配”(“;
 9.“\w”:匹配字母或數字或下劃線,任意一個字母或數字或下劃線,即A~Z,a~z,0~9,_中任意一個;
 10.“\W”:匹配任意不是字母、數字、下劃線的字符;
 11.“\d”:匹配數字,任意一個數字,0~9中的任意一個,等效於”[0-9]”;
 12.“\D”:匹配任意非數字的字符,等效於”[^0-9]”;
 13. {n}”:”n”是非負整數,正好匹配n次;
 14. “{n,}”:”n”是非負整數,至少匹配n次;
 15. “{n,m}”:”n”和”m”是非負整數,其中n<=m,匹配至少n次,至多m次;
 16. [a-z]”:字符範圍,匹配指定範圍內的任何字符;
 17. [^a-z]”:反向範圍字符,匹配不在指定的範圍內的任何字符;
 18. “( )”:將”(“和”)”之間的表達式定義爲”組”group,並且將匹配這個表達式的字符保存到一個臨時區域,一個正則表達式中最多可以保存9個,它們可以用”\1”到”\9”的符號來引用;
 19. “(pattern)”:匹配pattern並捕獲該匹配的子表達式,可以使用$0…$9屬性從結果”匹配”集合提取

regex_match()算法可以用於比較一個給定源字符串和一個正則表達式模式,如果模式匹配整個源字符串,則返回true,否則返回false。

regex_search()算法可以在輸入字符串中提取匹配的子字符串。smatch對象sm將包含搜索結果。如果要獲得第一個捕捉組的字符串表達形式,可在代碼中編寫m[1]或m[1].str()。通過查看m[1].first和m[1].second迭代器可以得到這個子字符串在源字符串中出現的準確位置。

regex_iterator 逐一迭代正則查找的所有匹配成果。一般情況下,需要爲某個特定的容器指定一個尾迭代器,但是對於regex_iterator,只有一個end值。只需要通過默認的構造函數聲明一個regex_iterator類型,就可以獲得這個尾迭代器:這個尾迭代器會被隱式地初始化爲end值。

regex_iterator有助於迭代“匹配合格”的子序列。然而有時候你會想處理那些子序列之間的內容,特別是當你打算將string拆分爲一個個語彙單元token或以某個東西分割string,分隔符甚至可能被指定爲一個正則表達式。regex_token_iterator就提供了這樣的功能。
爲了將它初始化,需要傳給它字符序列的起點和終點,以及一個正則表達式。此外還可以指明一列整數值,用來表示語彙化過程中的元素: 
* -1:表示你對每一個“匹配之正則表達式之間”或“語彙切分器之間”的子序列感興趣 
* 0:表示你對每一個匹配之正則表達式或語彙切分器感興趣 
* 任何其他數字nn:表示你對正則表達式中的第nn個匹配次表達式感興趣

regex_replace()算法要求輸入一個正則表達式,以及一個用於替換匹配子字符串的格式化字符串。這個格式化字符串可以通過轉義序列引用匹配子字符串中的部分內容。
$n	匹配第n個捕捉組的字符串。例如$l表示第一個捕捉組,$2表示第二個,依此類推
$&	匹配整個正則表達式的字符串,等同於$0
$`	在源字符串中,在匹配正則表達式的子字符串左側的部分
$’	在源字符串中,在匹配正則表達式的子字符串右側的部分
$$	美元符號

cmatch和smatch類分別存放char*和string類型的捕獲結果,遍歷即可獲得。

例子:

//匹配電話號碼:
string pattern = "^[0-9]{11}$";  //電話號碼以數字開頭數字結尾,數字出現11次
regex re(pattern);
char arr[1024] = {0};
cin.getline(arr, 1024);		
string str(arr);
bool res=regex_match(str, re);


//匹配www開頭,com結尾的網址
string pattern2 = "^([w]{3})\.([A-Za-z]+)\.(com)$";   //括號會把匹配的字串提取出來並保存
regex re(pattern2);
smatch mas;  //mas就是用來保存提取出來的字串,第0個元素是整個字串,後面的纔是提取的部分字串
cin.getline(arr, 1024);		
string str(arr);
cout << regex_match(str, re) << endl;
regex_search(str,mas,re);
cout << mas[0] << " " << mas[1] << " " << mas[2] <<"  "<<mas[3]<< endl;
//mas[0]保存整個字串
//mas[1]保存第一個字串,即www
//mas[2]保存第二個字串,即網址中間部分
//mas[3]保存第三個字串,即com
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章