[C++] 95 文字列からひらがなを取り出す wregex

[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;
}
--------------------------------------------------
出力
--------------------------------------------------
ひらがな抽出 みずあさぎ

参考サイト1
参考サイト2