この記事は最終更新日から1年以上が経過しています。
@programming
投稿日 2021/2/9
更新日 2021/2/10 ✏
C++で正規表現パターンマッチ&置換
C++の標準ライブラリstd::regex
で正規表現を使ったパターンマッチと置換を行う方法です。
目次:
前提
- Ubuntu 16.04 LTS
- g++ 7.5.0
- C++11
サンプルコード
以下はISO日付文字列を分解したり時刻部分を置換したりするサンプルです。
regex-test.cpp
#include <iostream>
#include <regex>
using namespace std;
int main(int argc, char* argv[]) {
//
// パターンマッチ
//
// ISO日付文字列 (例: "2021-01-31T23:45:59.012Z") を分解する正規表現:
regex re(R"(^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)\.(\d+)Z$)");
// ISO日付文字列:
string txt = "2021-01-31T23:45:59.012Z";
// マッチを検索:
smatch m;
regex_match(txt, m, re);
// マッチした数:
int msize = m.size(); // マッチしなかった場合、msizeはゼロ
cout << "マッチ数: " << msize << endl;
// マッチした値を出力:
for (int i = 0; i < msize; i++) {
cout << " " << i << ": " << m[i] << endl;
}
//
// 置換
//
// 時刻部分にマッチさせる正規表現:
regex rere(R"(T\d{2}:\d{2}:\d{2}.\d+Z)");
// 置換を実行:
string result = regex_replace(txt, rere, "T00:00:00.000Z");
cout << "時刻部分を置換: " << result << endl; // "2021-01-31T00:00:00.000Z"
}
コンパイル&実行:
## コンパイル&実行:
$ g++ -o a.out regex-test.cpp && ./a.out
マッチ数: 8
0: 2021-01-31T23:45:59.012Z
1: 2021
2: 01
3: 31
4: 23
5: 45
6: 59
7: 012
時刻部分を置換: 2021-01-31T00:00:00.000Z
以上です。