理解c++11正則表達式 (1)


概要

C++11提出了正則表達式這個概念,只需在頭文件中包含#include<regex>即可。我們可以完成:

  • Match 將整個輸入拿來比對匹配某個正則表達式
  • Search 查找與正則表達式吻合的pattern
  • Tokenize 根據被指定的正則表達式的切分器取得語匯單元,即切詞
  • Replace 簡單的理解就是替換掉和正則表達式吻合的第一個子序列

 

正文

首先,我們看一下下面的代碼:

regex reg1("<.*>.*</.*>");
bool found = regex_match("<tag>value</tag>",reg1);
out(found);

.  指得是除了 換行符 以外的所有字符。

*指的是“0次或者多次”。

通過regex_match()函數判斷是否吻合上述的pattern(樣式)。regex_match("<tag>value</tag>",reg1)將返回true。

 

regex reg2("<(.*)>.*</\\1>");
bool found = regex_match("<tag>value</tag>",reg2);
out(found);

(.*)定義了所謂的capture group 捕獲組的概念,通過這個(.*),之后就可以通過\1來指代它了。我們可以采用另一種寫法(raw string):

regex reg2(R("<(.*)>.*</\1>"));

這個方法允許准確的寫出其內容。他的准確格式是R"delim()delim" delim指的是字符序列,不包含空格,括號,反斜線。

 

regex reg3("<\\(.*\\)>.*</\\1>",regex_constants::grep);
bool found = regex_match("<tag>value</tag>",reg3);
out(found);

 第二個實參類似unix grep命令。必須用額外的反斜線將欲成為group的字符包起來。

 

bool found = regex_match("<tag>value</tag>","<(.*)>.*</\\1>");   //error
bool found = regex_match(string("<tag>value</tag>"),"<(.*)>.*</\\1>"); //error
bool found = regex_match("<tag>value</tag>", regex("<(.*)>.*</\\1>")); //right

從上面的例子可以看出,在regex_match函數里調用string是不夠的,雖然有隱式轉換,但是語句會報錯。

 

最后是討論regex_search()和regex_match()的唯一的區別:

regex_match():檢驗是否整個字符串列 和某個正則表達式吻合。

regex_search(): 檢驗部分是否吻合。

我們可以查看下面的例子:

regex_search(data,regex(pattern));
regex_match(data,regex("(.*|\n)* + pattern + (.*|\n)*"));

 (.*|\n)* 指的是:任何數量 任何字符包括\n。 值的是而上面的兩個函數表達的意思是同一個。

 

小結

我們可以從上面的例子看出,兩個函數只能進行true | false的查找?如果我想知道 我這個位置在哪兒?怎么辦?那就需要介紹新版的regex_search()和regex_match()。

 

注:C++11學習筆記 轉載請注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM