読者です 読者をやめる 読者になる 読者になる

どせいたんさき。

ナスダヨー

C++ でファイルグロブを使った文字列マッチング

目的

C++ で文字列がパターンに一致するかを手軽に判定したい.

第一候補としてあがったのは std::regex なのだが,きちんと std::regex の実装がなされるのは g++ のバージョン 4.9 以上かららしい.手元の環境では g++ のバージョンが 4.8 だったので残念ながら利用できない.

解決方法

ここでは C 言語の fnmatch.h を利用することにした.ただし fnmatch では正規表現ではなくてファイルグロブの形式で文字列のマッチングを行なう.ようするに shell のファイル名などで用いられるワイルドカードである.

#include <iostream>
#include <fnmatch.h>
int
main()
{
  const char* str = "hogefugahomu";
  const char* pat = "*homu";
  if (fnmatch(pat,str,FNM_PATHNAME) == 0) std::cout << "matched\n";
  return 0;
}
$ g++ a.cc
$ ./a.out
matched

fnmatch() は引数にパターン,文字列,フラッグをとる.フラッグにはいろいろと種類があるが,ファイル名のマッチングに使用するのであれば FNM_PATHNAME をセットしておくと,アスタリスク(*)やクエスチョン(?)がスラッシュ(/)に展開されないので便利である.

int fnmatch(const char* pattern, const char* string, int flags)