[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]
前回は開発速度を優先して泥臭い手法を用いましたが、今回はよりプログラマらしい内容に書き直しました。
対象文字列と全てのひらがなをstringからwstringに変換し、正規表現を使って対象文字列からひらがなを取り出しました。ひらがな設定は文字列リテラルを書き出すのではなくunicodeを使っています。
setlocaleでロケールを設定しないとひらがなを扱えないので要注意です。
マルチバイト文字の扱いにくさはC/C++の弱点の一つですね。Visual C++やC#など、Microsoftはその辺のフォローが行き届いているように思います。まあそれでもWindowsをメインOSにしようとは思いませんが..
#include <cppstd.h> // 自製c++標準ライブラリ群
string hiragana;
string narrow(const wstring &src) {
char *mbs = new char[src.length() * MB_CUR_MAX + 1];
wcstombs(mbs, src.c_str(), src.length() * MB_CUR_MAX + 1);
return mbs;
}
wstring wide(const string &src) {
wchar_t *wcs = new wchar_t[src.length() + 1];
mbstowcs(wcs, src.c_str(), src.length() + 1);
return wcs;
}
string hiragana_extract(string str){
string expr = "[\\u3041-\\u309F]+"; // ひらがな
wstring wstr = wide(str);
wstring wexpr = wide(expr);
std::wregex we(wexpr);
std::wsmatch wm;
if(std::regex_search(wstr, wm, we)){
hiragana = narrow(wm.str());
}
return hiragana;
}
int main()
{
setlocale(LC_CTYPE, "");
string test = "水浅葱 みずあさぎhello [123]";
string hiragana = hiragana_extract(test);
cout << "ひらがな抽出 " << hiragana << endl;
}
--------------------------------------------------
出力
--------------------------------------------------
ひらがな抽出 みずあさぎ