理解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次或者屢次」。spa

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

 

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

(.*)定義了所謂的capture group 捕獲組的概念,經過這個(.*),以後就能夠經過\1來指代它了。咱們能夠採用另外一種寫法(raw string):code

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

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

 

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是不夠的,雖然有隱式轉換,可是語句會報錯。string

 

最後是討論regex_search()和regex_match()的惟一的區別:io

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學習筆記 轉載請註明出處。

相關文章
相關標籤/搜索