stringに格納されたファイルパスから拡張子を判別する方法についてお聞きします。
具体的にはそのファイルパスがDXライブラリで使用できる音声ファイルであることを確かめたいと思っています。
(更に具体的に言うと、ドラッグアンドドロップされたファイルが音声ファイルならある処理を、画像ならある処理を、それ以外ならMessageBoxという風にしたいと考えています)
テスト用に下のコードを書きました。
#include <regex>
#include <iostream>
#include <string>
int main()
{
// str1とstr3が正しいwavファイルのパス
std::string str1("sth/sdfg/sdf.wav");
std::string str2("sth/sdfg/sdf.wavv");
std::string str3("sth/sd.fg/sdf.wav");
std::regex regSoundFile(R"([^.]+\.(wav|ogg|mp3)$)", std::regex::icase | std::regex::ECMAScript);
if (std::regex_match(str1, regSoundFile)){
std::cout << "str1 matched.\n";
}
if (std::regex_match(str2, regSoundFile)){
std::cout << "str2 matched.\n";
}
if (std::regex_match(str3, regSoundFile)){
std::cout << "str3 matched.\n";
}
return 0;
}
このコードでは、結果はstr1のみマッチと、str3のようにフォルダ名に「.」が含まれると上手く判定されません。
ピリオドを許容するようにと、
とするとやはり貪欲法のためどれにもマッチしなくなってしまいます。
stringクラスのsubstr()やfind()を使ってもいいのですが、許容する拡張子の種類だけif文内の行数が増え、
あまりスマートではないように思います(case-sensitiveも考慮する必要があります)。
出来るだけ正規表現で判別を実現したいのですが、何かいい方法はあるでしょうか?