C++11提出了正則表達式這個概念,只需在頭文件中包含#include<regex>便可。咱們能夠完成:正則表達式
首先,咱們看一下下面的代碼:函數
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學習筆記 轉載請註明出處。