C++ 11 新特性之正規表示式

usher2007發表於2016-09-10

前 8 篇在這裡:

這是C++11新特性介紹的第九部分,涉及到正規表示式相關的新特性。

不想看toy code的讀者可以直接拉到文章最後看這部分的總結。

題外話

對regex的完整支援,直到g++4.9才算完善。我使用的系統是Ubuntu14.04,預設g++版本號是4.8.x,所以有一些regex功能無法編譯通過。可以通過以下方法安裝g++4.9:

安裝完成之後,需要在Makefile中強制指定所使用的g++版本。

簡單用法

一切就緒,先看看如何用C++11中的regex匹配一個電子郵箱地址。

C++中的regex預設使用ECMA-262正規表示式規範,這也是眾多瀏覽器所使用的標準。
注意到email_pattern中有好多雙斜線,這是因為除了regex模組要做一次轉義解析外,C++ string也會對字串做一次轉義解析。

regex選項

在構造regex物件時,可以指定多種標識已實現特定的效果。這裡以使用regex::icase達到不區分大小寫的匹配為例。

regex iterator

regex提供了一個迭代器,這個迭代器生成時需要一個所搜尋字串的範圍以及一個regex物件。之後,迭代器在迭代時,會遍歷搜尋字串中的所有匹配位置。

子表示式

regex也支援子表示式,和其他正規表示式一樣,使用括號括起來的構成一個子表示式。在匹配結果中,序號0表示整個匹配結果,序號1表示子表示式1的匹配結果……

下面以一個座機電話號碼的匹配驗證為例,說明子表示式的運用:

replace

regex同樣提供了替換功能。將替換功能和子表示式結合起來,可以實現字串的格式化功能:

其中format字串中$2和$5就分別表示第二個子表示式和第5個子表示式。

輸出

整個測試程式的輸出結果如下:

總結

  1. C++11種提供了regex模組,需要g++-4.9以上才能完整支援。
  2. regex預設採用ECMA-262標準,和瀏覽器中使用的一樣。
  3. regex提供了查詢、匹配、迭代器、子表示式、替換等常用用法。

完整程式碼詳見regex.cpp

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

C++ 11 新特性之正規表示式 C++ 11 新特性之正規表示式

相關文章