C++で正規表現パターンマッチ&置換
この記事は最終更新日から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	

以上です。


芽萌丸プログラミング部
芽萌丸プログラミング部@programming
プログラミング関連アカウント。Web標準技術を中心に書いていきます。フロントエンドからサーバサイドまで JavaScript だけで済ませたい人たちの集いです。記事は主に @TanakaSoftwareLab が担当。