C++
boost
regex

boost::regexの怪

ハマったので自分用にメモ

boost::regex hoge("(?:\".+?\"|[^:\\ ]+?)");

こんなコードがあるとして、エラーにならないけど、マッチしない場合がありました。

動くんだけど、マッチしない。
他の言語、環境ならマッチするのになんでや!

意味が分からないので、なんとなくOR条件の前後を入れ替えてみました。

boost::regex hoge("(?:[^:\\ ]+|\".+?\")");

すると例外が発生します。なんやて!ウソやろ。。。
文字クラスがおかしいらしい・・・

原因は文字クラスのエスケープシーケンスが不足していたため。
boost::regex hoge("(?:\".+?\"|[^\\:\\\\ ]+)");

boostのバージョンとか環境にもよると思いますが、中途半端に動いちゃうためにドツボにハマってしまいました。
定義した時点で正規表現がおかしかったら例外が発生すると思ってた(実際してた)のでなおさら。