(また)Visual Studio 2005 の正規表現置換えが正常に動作しない。

前回に引き続き また見つけちゃいました*1。なんでかなーもう。orz

そして、謎なこと(そして、IDE製作チームにとっては悪夢なこと)に、再現性が100%でないという代物。^^;

というわけで、再現するかどうかわかりませんが………



以下のソースコードoggogg.h の一部のですが、とりあえずコレを Visual Studio 2005 のエディタに適当に貼り付けます。


typedef struct {
  unsigned char *data;
  int storage;
  int fill;
  int returned;

  int unsynced;
  int headerbytes;
  int bodybytes;
} ogg_sync_state;

/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/

extern void  oggpack_writeinit(oggpack_buffer *b);
extern void  oggpack_writetrunc(oggpack_buffer *b,long bits);
extern void  oggpack_writealign(oggpack_buffer *b);
extern void  oggpack_writecopy(oggpack_buffer *b,void *source,long bits);
extern void  oggpack_reset(oggpack_buffer *b);
extern void  oggpack_writeclear(oggpack_buffer *b);
extern void  oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);
extern void  oggpack_write(oggpack_buffer *b,unsigned long value,int bits);
extern long  oggpack_look(oggpack_buffer *b,int bits);
extern long  oggpack_look1(oggpack_buffer *b);
extern void  oggpack_adv(oggpack_buffer *b,int bits);
extern void  oggpack_adv1(oggpack_buffer *b);
extern long  oggpack_read(oggpack_buffer *b,int bits);
extern long  oggpack_read1(oggpack_buffer *b);
extern long  oggpack_bytes(oggpack_buffer *b);
extern long  oggpack_bits(oggpack_buffer *b);
extern unsigned char *oggpack_get_buffer(oggpack_buffer *b);

extern void  oggpackB_writeinit(oggpack_buffer *b);
extern void  oggpackB_writetrunc(oggpack_buffer *b,long bits);
extern void  oggpackB_writealign(oggpack_buffer *b);
extern void  oggpackB_writecopy(oggpack_buffer *b,void *source,long bits);
extern void  oggpackB_reset(oggpack_buffer *b);
extern void  oggpackB_writeclear(oggpack_buffer *b);
extern void  oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);
extern void  oggpackB_write(oggpack_buffer *b,unsigned long value,int bits);
extern long  oggpackB_look(oggpack_buffer *b,int bits);
extern long  oggpackB_look1(oggpack_buffer *b);
extern void  oggpackB_adv(oggpack_buffer *b,int bits);
extern void  oggpackB_adv1(oggpack_buffer *b);
extern long  oggpackB_read(oggpack_buffer *b,int bits);
extern long  oggpackB_read1(oggpack_buffer *b);
extern long  oggpackB_bytes(oggpack_buffer *b);
extern long  oggpackB_bits(oggpack_buffer *b);
extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b);

さて、関数宣言で「スペース2個以上続いている部分が気にくわない」 とします。(ぉ

  • 置換え文字列 = " +"
  • 置換え後文字列 = " "

として、関数定義の部分を選択。「選択範囲を置換え(ここ重要)」をすると上手く行く……ハズなのに、一部 extern の "e" が消えてしまったりと誤爆がちらほら………

http://ir9.jp/hd/hd060903_00.png
↑中途半端に置換えしてるのかしらー
ちなみに、この挙動を発見した元のコードはもうちょっと誤爆が激しかったのです…。


冒頭でも触れましたが、私には再現性が解りませんでした。どういう文字列に対して置換えすると誤爆するのかがサッパリ解らず。


んもーなんじゃこりゃー _| ̄|●

*1:もうバグレポ上がってたりするのかしら…