正規表現ライブラリ (C++11以降)
From cppreference.com
< cpp
正規表現ライブラリは、文字列内でのパターンマッチングを実行するために使用されるミニ言語の一種である正規表現を表すクラスを提供します。正規表現に関するほとんどすべての操作は、以下のオブジェクトのいくつかを操作することで特徴づけられます。
- 対象シーケンス (Target sequence)。パターンが検索される文字シーケンス。これは、2つのイテレータで指定される範囲、ヌル終端文字列、またはstd::stringです。
- パターン (Pattern)。これは正規表現そのものです。何がマッチを構成するかを決定します。これは、特別な文法を持つ文字列から構築されるstd::basic_regex型のオブジェクトです。
- マッチした配列 (Matched array)。マッチに関する情報は、std::match_results型のオブジェクトとして取得できます。
- 置換文字列 (Replacement string)。マッチした部分をどのように置換するかを決定する文字列です。
目次 |
[編集] 正規表現文法
パターンと置換文字列は、以下の正規表現文法をサポートします。
- 修正ECMAScript正規表現文法。これがデフォルトの文法です。
- 基本POSIX正規表現文法.
- 拡張POSIX正規表現文法.
- POSIXのawkユーティリティで使用される正規表現文法。
- POSIXのgrepユーティリティで使用される正規表現文法。これは実質的に基本POSIX正規表現文法と同じですが、選択(alternation)の区切り文字として改行文字'\n'が追加されています。
- POSIXのgrepユーティリティで-Eオプションを付けて使用される正規表現文法。これは実質的に拡張POSIX正規表現文法と同じですが、選択の区切り文字として'|'に加えて改行文字'\n'が追加されています。
いくつかの文法のバリエーション(大文字小文字を区別しないマッチングなど)も利用可能です。詳細はこのページを参照してください。
[編集] 主要なクラス
これらのクラスは、正規表現と、対象の文字シーケンス内での正規表現のマッチング結果をカプセル化します。
| (C++11) |
正規表現オブジェクト (クラステンプレート) |
| (C++11) |
部分式にマッチした文字シーケンスを識別する (クラステンプレート) |
| (C++11) |
すべての部分式マッチを含む、1つの正規表現マッチを識別する (クラステンプレート) |
[編集] アルゴリズム
これらの関数は、regexにカプセル化された正規表現を対象の文字シーケンスに適用するために使用されます。
| (C++11) |
正規表現を文字シーケンス全体にマッチさせようと試みる (関数テンプレート) |
| (C++11) |
正規表現を文字シーケンスの任意の部分にマッチさせようと試みる (関数テンプレート) |
| (C++11) |
正規表現に一致した箇所を、書式化された置換テキストで置き換える (関数テンプレート) |
[編集] イテレータ
正規表現イテレータは、シーケンス内で見つかった正規表現マッチの全セットを走査するために使用されます。
| (C++11) |
文字シーケンス内のすべての正規表現マッチをイテレートする (クラステンプレート) |
| (C++11) |
指定された文字列内のすべての正規表現マッチの中の指定された部分式、またはマッチしなかった部分文字列をイテレートする (クラステンプレート) |
[編集] 例外
このクラスは、正規表現ライブラリからのエラーを報告するために例外としてスローされるオブジェクトの型を定義します。
| (C++11) |
正規表現ライブラリによって生成されたエラーを報告する (クラス) |
[編集] トレイト
正規表現トレイトクラスは、正規表現のロケール依存の側面をカプセル化するために使用されます。
| (C++11) |
正規表現ライブラリが必要とする、文字型に関するメタ情報を提供する (クラステンプレート) |
[編集] 定数
| 名前空間 `std::regex_constants` で定義されています
| |
| (C++11) |
正規表現の振る舞いを制御する一般的なオプション (typedef) |
| (C++11) |
マッチングに特化したオプション (typedef) |
| (C++11) |
さまざまな種類のエラーを記述する (typedef) |
[編集] 例
このコードを実行
#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].