Namespaces
Variants

Regular expressions library (since C++11)

From cppreference.net

正規表現ライブラリは、 正規表現 を表現するクラスを提供します。正規表現は、文字列内でパターンマッチングを実行するために使用される一種のミニ言語です。正規表現を用いたほぼすべての操作は、以下のオブジェクトのいくつかを操作することで特徴づけられます:

  • ターゲットシーケンス 。パターン検索の対象となる文字シーケンス。これは2つのイテレータで指定される範囲、ヌル終端文字列、または std::string で指定できます。
  • Pattern . これは正規表現そのものです。何がマッチするかを決定します。これは std::basic_regex 型のオブジェクトであり、特別な 文法 を持つ文字列から構築されます。
  • マッチした配列 。マッチに関する情報は、 std::match_results 型のオブジェクトとして取得できます。
  • 置換文字列 . これは、一致部分をどのように置換するかを決定する文字列です。

目次

正規表現文法

パターンと置換文字列は以下の正規表現文法をサポートします:

  • 修正ECMAScript正規表現文法 。これがデフォルトの文法です。
  • 基本POSIX正規表現文法
  • 拡張POSIX正規表現文法
  • POSIXにおける awk ユーティリティで使用される正規表現文法。
  • POSIXにおける grep ユーティリティで使用される正規表現文法。これは基本的には基本POSIX正規表現文法と同じですが、改行 ' \n ' が選択肢区切りとして追加されています。
  • POSIXにおける grep ユーティリティで - E オプションを指定して使用される正規表現文法。これは基本的には拡張POSIX正規表現文法と同じですが、 '|' に加えて改行 ' \n ' も選択肢区切りとして追加されています。

一部の文法バリエーション(大文字小文字を区別しないマッチングなど)も利用可能です。詳細は this page を参照してください。

メインクラス

これらのクラスは、正規表現と、文字のターゲットシーケンス内で正規表現をマッチングした結果をカプセル化します。

正規表現オブジェクト
(クラステンプレート)
(C++11)
部分式によってマッチした文字シーケンスを識別する
(クラステンプレート)
1つの正規表現マッチと、すべての部分式マッチを識別する
(クラステンプレート)

アルゴリズム

これらの関数は、正規表現をカプセル化したregexを対象文字シーケンスに適用するために使用されます。

正規表現が文字シーケンス全体に一致するかどうかを試行する
(関数テンプレート)
正規表現が文字シーケンスの任意の部分に一致するかどうかを試行する
(関数テンプレート)
正規表現の一致をフォーマット済みの置換テキストで置き換える
(関数テンプレート)

イテレータ

正規表現イテレータは、シーケンス内で見つかった正規表現マッチの全セットを走査するために使用されます。

文字シーケンス内のすべての正規表現マッチを反復処理する
(クラステンプレート)
指定された文字列内のすべての正規表現マッチ内の特定の部分式、または非マッチ部分文字列を反復処理する
(クラステンプレート)

例外

このクラスは、正規表現ライブラリからのエラーを報告する例外としてスローされるオブジェクトの型を定義します。

正規表現ライブラリによって生成されたエラーを報告する
(クラス)

Traits

正規表現特性クラスは、正規表現のローカライズ可能な側面をカプセル化するために使用されます。

文字型に関するメタ情報を提供し、正規表現ライブラリで必要とされる
(クラステンプレート)

定数

namespaceで定義 std::regex_constants
正規表現の動作を制御する一般的なオプション
(typedef)
マッチングに固有のオプション
(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].