From: WATANABE Hirofumi Date: 1997-04-02T11:16:27+09:00 Subject: [ruby-list:2564] Re: ruby 1.0-970331 released わたなべです. rbdj0331.lzh, rbgw0331.lzh を put しました. matz@caelum.co.jp (Yukihiro Matsumoto) writes: :アナウンスするのを忘れていましたが,970331が出ています.正規 :表現のバグとりを試してみてください. \W, [\W], [^\w] は同じにならないとまずいですよね. 簡単なスク リプトでチェックしてみました. regtable = ['\W', '[\W]', '[^\w]', '\S', '[\S]', '[^\s]', '\D', '[\D]', '[^\d]'] regtable.each {|r| printf "%-5s: ", r 'あい'.sub(r, 'a').each_byte {|c| printf "%02x ", c } print "\n" } 結果: \W : 61 a2 a4 a4 [\W] : 61 a4 a4 [^\w]: 61 a2 a4 a4 \S : 61 a2 a4 a4 [\S] : 61 a4 a4 [^\s]: 61 a2 a4 a4 \D : 61 a2 a4 a4 [\D] : 61 a4 a4 [^\d]: 61 a2 a4 a4 というわけで \W, [^\w] も日本語とマッチさせる patch です. た だし -Kn 時はまだバグってます(眠かったから :-). それと break の後に意味のないコードがあったんで削除しました. -- わたなべひろふみ --- ../ruby-1.0-970331/regex.c Fri Mar 28 14:46:34 1997 +++ ./regex.c Wed Apr 2 02:43:36 1997 @@ -1285,14 +1286,6 @@ b += b[-1] + 2 + EXTRACT_UNSIGNED(&b[b[-1]])*4; break; - while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) - b[-1]--; - if (b[-1] != (1 << BYTEWIDTH) / BYTEWIDTH) - memmove(&b[b[-1]], &b[(1 << BYTEWIDTH) / BYTEWIDTH], - 2 + EXTRACT_UNSIGNED(&b[(1 << BYTEWIDTH) / BYTEWIDTH])*4); - b += b[-1] + 2 + EXTRACT_UNSIGNED(&b[b[-1]])*4; - break; - case 'w': laststart = b; BUFPUSH(wordchar); @@ -2427,7 +2420,6 @@ case charset_not: { int not; /* Nonzero for charset_not. */ - int two; /* 2 if move 2 bytes forward */ int c; PREFETCH; @@ -2441,7 +2433,7 @@ else if (translate) c = (unsigned char)translate[c]; - two = not = is_in_list(c, p); + not = is_in_list(c, p); if (*(p - 1) == (unsigned char)charset_not) not = !not; @@ -2451,7 +2443,7 @@ SET_REGS_MATCHED; d++; - if (d != dend && two == 2) + if (d != dend && c >= 1 << BYTEWIDTH) d++; break; } @@ -2643,6 +2635,8 @@ PREFETCH; if (IS_A_LETTER(d)) goto fail; + if (ismbchar(*d) && d + 1 != dend) + d++; d++; SET_REGS_MATCHED; break;