記事を書く余裕がなくて自分用にまとめただけの記事です.かなり見辛いと思います.
C++ で正規表現を扱う手順:std::regex
インクルードが必要なヘッダ:std::regex
(#include <regex>
)
- 検索にかけたい文字列を定義 or 標準入力.
- 正規表現の定義.
R"(正規表現)"
で C++ で raw 文字列を扱える(\
をエスケープする必要がなくなる):string pattern = R"(hogehoge)";
(一番外側の括弧はマッチ全体.内側に括弧を入れることでマッチ結果のグルーピングができる) - マッチ結果を受け取るオブジェクトの定義.
- string クラス:
std::smatch
クラス で定義. - C 言語の文字列(文字列リテラルなど):
std::match_results<const char*>
クラスで定義.
- string クラス:
- 正規表現で検索:
std::regex_search(文字列 or 文字列変数, results, std::regex(pattern))
(マッチしたかどうかのフラグとしても扱える) - マッチオブジェクト
results
から結果を受け取る.マッチしたグループへのアクセスもできる.results[0]
:マッチ全体results[1]
:一つ目のグループへアクセス
標準入力を 1 行丸々受け取る:std::getline, std::cin.ignore
std::cin >> N;
で行数を受け取り,その後 N 行分のログを受け取る,などの操作の時に用いる.
std::getline(std::cin, 文字列変数)
で,変数に標準入力の 1 行分を丸々格納.std::cin >> N;
などと併用する場合,直後にcin.ignore();
を付け足し,改行文字 1 文字分を無視する必要がある.その後std::getline
を実行する.
std::cin >> N;
では,入力の "N\n"
の "N"
部分だけを受け取り "\n"
を残したままにしてしまう.そのため,入力が改行されている場合,cin.ignore();
を直後に実行しないとその後の入力を上手く受け取れないため注意.
正規表現サンプル
- 正規表現一覧
- 正規表現サンプル集
- 数値範囲の正規表現を自動生成