[C++] 正規表現で文字列から日付の部分を抜き出す


目次
https://qiita.com/tera1707/items/4fda73d86eded283ec4f

やりたいこと

ファイル名の文字列に日付を表す部分が含まれてるので、それを抜き出したい。
具体的には、「Log_20201026+0900.csv」みたいな感じでログファイル名に日付が入ってる感じになってるので、「20201026+0900」の部分を抜き出したい。

やり方

正規表現を使う。

サンプル

#include <iostream>
#include <regex>

int main()
{
    // ログファイル名のサンプル
    std::wstring input = L"Log_20201026+0900.csv";
    // 正規表現(数字が8個の後に+or-があって、その後に数字4個、というパターン)
    std::wregex pattern(L"[0-9]{8}[+|-][0-9]{4}");

    std::wsmatch match;
    if (std::regex_search(input, match, pattern))
    {
        std::wcout << match[0].str() << std::endl;
    }

    // regex_searchは、最初にマッチした部分しか取れない
    system("pause");
}

match[0]の中に、ヒットした部分の文字列が入ってくる。
regex_search()は、基本的には検索対象の文字列の中のヒットした1つ目の部分しか取れない様子。
(例えば上のサンプルでL"Log_20201026+0900_20201026+0900.csv"を対象に検索しても、一つ目の「20201026+0900」しか取れない、ということ。)

それを、2つ目以降も取れるようにしようと思うと、見る位置をずらす、などの工夫が必要になる。
こちら参照

参考

C++標準のregex_search(正規表現)の動作と使用方法
https://taiyakisun.hatenablog.com/entry/20140630/1404140319

正規表現関数(MSDocs)
https://docs.microsoft.com/ja-jp/cpp/standard-library/regex-functions?view=msvc-160