From: "きむらこういち" Date: 2006-11-29T00:29:02+09:00 Subject: [ruby-dev:29970] BUG: Incorrect handling of Ignorecase matching (regex.c of 1.8.5) 木村です。 2ちゃんねるのRubyスレで報告されていたのですが、1.8以前のregex ルーチンの (?i) フラグの処理に問題があります。たとえば /(B|(?i)c)/ =~ 'B' でマッチに失敗します。 これは検索の高速化のために作成している fastmap の生成時に (?i) フラグを見つけた時点で「Ignorecase指定がされている」という フラグ(下のパッチにも見えるRE_MAY_IGNORECASE)を立て てしまうので、(?i)が見つかる以前にfastmapに登録した内容が 無効になってしまい、結果として検索に失敗する。というものです。 いろいろ考えてみたのですが、あまり広範囲に渡る修正は避ける という方針で以下のようなパッチを作成してみました。 Ignorecase指定を見つけたら、それまでに登録したfastmapへの 情報を更新するようにしたものです。 バグの説明等でもっと詳細を知らせろということなら再度書きます のでよろしくお願いします。なおす/なおさないの判断や、修正の 方針についてはお任せします。 --- regex.c.orig 2006-08-07 12:43:42.000000000 +0900 +++ regex.c 2006-11-28 23:31:32.274500000 +0900 @@ -2836,6 +2836,20 @@ re_compile_fastmap(bufp) case casefold_on: bufp->options |= RE_MAY_IGNORECASE; options |= RE_OPTION_IGNORECASE; + { + static found_casefold = 0; + if (!found_casefold) { + unsigned char *p = (unsigned char*)fastmap; + int i; + for (i=0; i<=(1<