正規表示式程式庫 (自 C++11 起)
出自 cppreference.com
< cpp
正規表示式程式庫提供了一個用來表示正規表示式的類別,這是一種用於在字串中執行模式比對的小型語言。幾乎所有與正規表示式相關的操作,都可以歸納為對以下數個物件的操作:
- 目標序列 (Target sequence)。搜尋模式時所使用的字元序列。這可以是由兩個迭代器指定的範圍、以空字元結尾的字串,或是 std::string。
- 模式 (Pattern)。即正規表示式本身。它決定了什麼構成一個匹配。這是一個 std::basic_regex 類型的物件,由具有特殊語法的字串所建構。
- 匹配陣列 (Matched array)。有關匹配的資訊可以作為 std::match_results 類型的物件來擷取。
- 替換字串 (Replacement string)。這是一個決定如何替換匹配項的字串。
目錄 |
[編輯] 正規表示式語法
模式與替換字串支援以下正規表示式語法
- 修改後的 ECMAScript 正規表示式語法。這是預設語法。
- 基本 POSIX 正規表示式語法.
- 擴充 POSIX 正規表示式語法.
- POSIX 中 awk 工具所使用的正規表示式語法。
- POSIX 中 grep 工具所使用的正規表示式語法。這基本上與基本 POSIX 正規表示式語法相同,並增加了換行符號 '\n' 作為選擇 (alternation) 分隔符。
- POSIX 中帶有 -E 選項的 grep 工具所使用的正規表示式語法。這基本上與擴充 POSIX 正規表示式語法相同,除了 '|' 之外,還增加了換行符號 '\n' 作為選擇分隔符。
也提供了一些語法變體(例如不區分大小寫的匹配),詳細資訊請參閱此頁面。
[編輯] 主要類別
這些類別封裝了正規表示式,以及在目標字元序列中執行匹配後的結果。
| (C++11) |
正規表示式物件 (類別樣板) |
| (C++11) |
識別由子表達式所匹配的字元序列 (類別樣板) |
| (C++11) |
識別一個正規表示式匹配,包含所有子表達式的匹配 (類別樣板) |
[編輯] 演算法
這些函式用於將封裝在 regex 中的正規表示式應用於目標字元序列。
| (C++11) |
嘗試將正規表示式與整個字元序列進行匹配 (函式樣板) |
| (C++11) |
嘗試將正規表示式與字元序列的任何部分進行匹配 (函式樣板) |
| (C++11) |
將正規表示式的出現替換為格式化的替換文字 (函式樣板) |
[編輯] 迭代器
正規表示式迭代器用於遍歷在序列中找到的所有正規表示式匹配項。
| (C++11) |
遍歷字元序列中所有的 regex 匹配項 (類別樣板) |
| (C++11) |
遍歷給定字串中所有 regex 匹配項內的指定子表達式,或遍歷未匹配的子字串 (類別樣板) |
[編輯] 例外
此類別定義了作為例外拋出的物件類型,用於報告來自正規表示式程式庫的錯誤。
| (C++11) |
報告正規表示式程式庫所產生的錯誤 (類別) |
[編輯] 特性 (Traits)
正規表示式特性類別用於封裝 regex 的可本地化層面。
| (C++11) |
提供有關字元類型的元資訊,這是正規表示式程式庫所需的 (類別樣板) |
[編輯] 常數
| 定義於命名空間
std::regex_constants | |
| (C++11) |
控制 regex 行為的一般選項 (類型定義) |
| (C++11) |
特定於匹配的選項 (類型定義) |
| (C++11) |
描述不同類型的匹配錯誤 (類型定義) |
[編輯] 範例
執行此程式碼
#include <iostream> #include <iterator> #include <regex> #include <string> int main() { std::string s = "Some people, when confronted with a problem, think " "\"I know, I'll use regular expressions.\" " "Now they have two problems."; std::regex self_regex("REGULAR EXPRESSIONS", std::regex_constants::ECMAScript | std::regex_constants::icase); if (std::regex_search(s, self_regex)) std::cout << "Text contains the phrase 'regular expressions'\n"; std::regex word_regex("(\\w+)"); auto words_begin = std::sregex_iterator(s.begin(), s.end(), word_regex); auto words_end = std::sregex_iterator(); std::cout << "Found " << std::distance(words_begin, words_end) << " words\n"; const int N = 6; std::cout << "Words longer than " << N << " characters:\n"; for (std::sregex_iterator i = words_begin; i != words_end; ++i) { std::smatch match = *i; std::string match_str = match.str(); if (match_str.size() > N) std::cout << " " << match_str << '\n'; } std::regex long_word_regex("(\\w{7,})"); std::string new_s = std::regex_replace(s, long_word_regex, "[$&]"); std::cout << new_s << '\n'; }
輸出
Text contains the phrase 'regular expressions' Found 20 words Words longer than 6 characters: confronted problem regular expressions problems Some people, when [confronted] with a [problem], think "I know, I'll use [regular] [expressions]." Now they have two [problems].