2013年11月24日
gcc の < regex > の正規表現の不思議
以下のプログラムは "G" という文字列が "A|T|G" という正規表現にマッチするかどうかを調べるもので,当然マッチするので ret=1 が期待する出力となる.
#include <regex> #include <iostream> using namespace std; using namespace std::regex_constants; int main(){ regex r("A|T|G"); string s("G"); bool ret=regex_match(s,r); cerr << "ret=" << ret << endl; }
が,いくつか試した gcc で出力が ret=1 になったのは svn 上の gcc (4.9.0 experimental) だけだった.Ubuntu 12.04 amd64 でソースからコンパイルした 4.8.2 でも ret=0 で,他に同Ubuntu の 4.6系 とソースからコンパイルした 4.7.2 もダメで,cygwin の 4.8.1 もダメだった.
Visual Studio では ret=1 になったらしい.Boost は大丈夫らしい.Mac の gcc のどれかも上の単純な例では大丈夫だったらしい.
どうも | で3つ以上つながると狂うらしい.まあ,Is gcc4.7 buggy about regular expressions? とかを見る限りだいぶ前からこの状況らしく,そもそも gcc (libstdc++) の regex は不完全であると.だがしかし,"A|T|G" とかいうレベルの単純な正規表現でもダメとか言うレベルの不完全さとか誰も想像できん.驚いた.
- Comments: 0
- TrackBack (Close): -