重要なお知らせ

C82お疲れ様でした!
記事

2012年07月22日

boostとC++0Bの::regexクラスの使い方に関するエトセトラ

IRCで動いているルーミアBOTのTwitter移植をC++でやっているのだがどうしてもパーサーに正規表現を搭載することが不可欠になってくる。
C++ではboostからstdにオミットされた ::regexと言う正規表現がある。
これはUNIXの正規表現をC++に移植したものでC++で唯一の正規表現ライブラリと言っても過言ではない。
今回はそれに見事に振り回されてしまったので記録としてここに書き留めておく。

基本BOTは日本語(全角文字)であるがC++の ::regexで日本語パーシングを行うと妙な動作をする。原因はSJISに::regexが対応してないからなのでwchar_t型にすればちゃんと動作する。

ところが ::regexを wchar_t で使用している事例がネット上では見つからなかった。(当時はstdとboostのもので違うものと思っていたため)

これから例を上げます。まずcharで書かれたもとのソースコードを表します。まずは普通のコードです。

int main() {
std::regex re("[0-9]+");
std::match_results results;

std::regex_search("xxx123456yyy", results, re, std::regex_constants::match_default);

return 0;
}

でこれを日本語対応にするとこうなります。

int main() {
std::wregex re(L"[0-9]+");
std::match_results results;

std::regex_search(L"xxx123456yyy", results, re, std::regex_constants::match_default);

return 0;
}

すべての文字をwchar_t型にし std::regexを std::wregexにします。(ここで5時間迷った。

これで日本語もいけるようになるはずです。C++日本語パーサーを作りたい人は参考にして下さいね。


posted by PentliumEE at 02:26 | Comment(1) | プログラム全般 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
こんにちは。
この記事とても助かりました。私も日本語の正規表現処理が一部異常動作し原因が分からず困ってましたが、この記事を拝見させていただき、対処したところ好調になりました。

本当にありがとうございます。
Posted by S.田中 at 2015年02月13日 00:42
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
簡易ゲーム機市場分析 for Google
据置機

携帯機

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。