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