木村です。

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<<BYTEWIDTH); i++) {
+                      if (p[i]) {
+                          /* p[i] = 0; Do we need this line?*/
+                          p[translate[i]] = 1;
+                      }
+                  }
+                  found_casefold = 1;
+              }
+          }
       continue;

      case casefold_off:



-- 
木村浩一
 I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
 mail kbk at kt.rim.or.jp
 web  www.kt.rim.or.jp/~kbk/zakkicho/index.html