【C++】std::regex_replaceで正規表現を使って文字列を置換する方法

目次

はじめに

C++で、「YYYY/MM/DD」という形式の日付文字列を、「YYYY年MM月DD日」という形式に変換したい、といった高度な文字列置換を行いたい場合があります。

C++11で導入された**<regex>ライブラリのstd::regex_replace**関数は、このような複雑なパターンの検索と置換を、非常に強力かつ柔軟に行うためのツールです。

この記事では、regex_replaceを使って、正規表現に一致した部分文字列を、キャプチャグループ(後方参照)を利用して新しいフォーマットの文字列に置き換える方法を解説します。


【前提】C++11とは?

C++11は、2011年に正式化されたC++言語のメジャーアップデート版です。<regex>ライブラリはこのC++11で導入されたため、利用するにはC++11以降に対応したコンパイラが必要です。


regex_replace を使ったサンプルコード

このコードは、「(姓), (名)」という形式の文字列を、「(名) (姓)」という順序に入れ替えます。

完成コード

#include <iostream>
#include <string>
#include <regex> // regex, regex_replace

using namespace std;

int main() {
    string original_text = "Name: Yamada, Taro";
    
    // 1. 検索パターンを正規表現で定義
    //    (\w+): 1文字以上の単語構成文字(英数字)にマッチする部分 (キャプチャグループ)
    regex pattern(R"((\w+), (\w+))");
    
    // 2. 置換後のフォーマットを定義
    //    $2は2番目の(), $1は1番目の()にマッチした部分を指す
    string format_string = "$2 $1";

    // 3. regex_replaceで置換を実行
    string replaced_text = regex_replace(original_text, pattern, format_string);
    
    // 4. 結果を出力
    cout << "元の文字列: " << original_text << endl;
    cout << "置換後の文字列: " << replaced_text << endl;
    
    return 0;
}

実行結果

元の文字列: Name: Yamada, Taro
置換後の文字列: Name: Taro Yamada

コードの解説

1. regex pattern(R"((\w+), (\w+))");

  • std::regex: 検索したいパターンを表現する正規表現オブジェクトを作成します。
  • R"(...)": Raw文字列リテラルです。\(バックスラッシュ)をエスケープする必要がなくなり、正規表現のパターンをそのまま記述できるため便利です。
  • (\w+): これがキャプチャグループです。
    • \w+: 1文字以上のアルファベット、数字、アンダースコアにマッチします。
    • (...): カッコで囲むことで、マッチした部分文字列を後から参照できるようになります。1番目の () がグループ1、2番目の () がグループ2です。

2. string format_string = "$2 $1";

置換後の文字列のフォーマットを定義します。

  • $1, $2: これらは**後方参照(バックリファレンス)**と呼ばれ、正規表現のキャプチャグループにマッチした文字列を指します。
    • $1: 1番目の (\w+) にマッチした文字列("Yamada"
    • $2: 2番目の (\w+) にマッチした文字列("Taro"
  • " $2 $1" は、「2番目のグループ、スペース、1番目のグループ」という順序で文字列を組み立てることを意味します。

3. string replaced_text = regex_replace(...)

  • 機能: 第1引数の文字列の中から、第2引数の正規表現パターンに一致する部分を探し、第3引数のフォーマット文字列に従って置換した、新しい文字列を返します。

まとめ

今回は、C++の std::regex_replace を使って、正規表現に基づいた高度な文字列置換を行う方法を解説しました。

  • <regex> ヘッダーをインクルードする。
  • std::regex で検索パターンを定義する。()キャプチャグループを作成する。
  • 置換フォーマット文字列の中で $n を使い、n番目のキャプチャグループの内容を後方参照する。
  • std::regex_replace で置換を実行する。

regex_replace を使いこなせば、ログの解析やデータ形式の変換など、複雑な文字列操作を、強力かつ柔軟に行うことができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次