From: UENO Katsuhiro Date: 2003-01-22T17:14:24+09:00 Subject: [ruby-dev:19413] Re: [] 内での \001 のマッチ うえのです。 On Wed, 22 Jan 2003 15:21:58 +0900 matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > その場合の$KCODEはなんですか? > いずれにしても先日のうえのさんパッチの副作用でしょうね。 $KCODE が NONE 以外だとダメですね。 p "\001\002\003\004".scan(/[\001\002\003\004]/n) # => ["\001", "\002", "\003", "\004"] p "\001\002\003\004".scan(/[\001\002\003\004]/e) # => [] p "\001\002\003\004".scan(/[\001\002\003\004]/u) # => [] p "\001\002\003\004".scan(/[\001\002\003\004]/s) # => [] 範囲指定なら動きます。 p "\001\002\003\004".scan(/[\001-\004]/n) # => ["\001", "\002", "\003", "\004"] p "\001\002\003\004".scan(/[\001-\004]/e) # => ["\001", "\002", "\003", "\004"] p "\001\002\003\004".scan(/[\001-\004]/u) # => ["\001", "\002", "\003", "\004"] p "\001\002\003\004".scan(/[\001-\004]/s) # => ["\001", "\002", "\003", "\004"] $KCODEが指定されているときに [] 内に単独で \xnn や \nnn が現れると それをマルチバイト文字とみなしているようです。 修正です。 Index: regex.c =================================================================== RCS file: /src/ruby/regex.c,v retrieving revision 1.78 diff -u -p -r1.78 regex.c --- regex.c 20 Jan 2003 08:29:21 -0000 1.78 +++ regex.c 22 Jan 2003 08:02:52 -0000 @@ -1555,7 +1555,7 @@ re_compile_pattern(pattern, size, bufp) case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': PATUNFETCH; - c = scan_oct(p, 3, &numlen); + c = scan_oct(p, 3, &numlen) & 0xff; p += numlen; had_num_literal = 1; break; @@ -1685,9 +1685,10 @@ re_compile_pattern(pattern, size, bufp) last = ':'; } } - else if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) { + else if (had_mbchar == 0) { SET_LIST_BIT(c); - had_num_literal = 0; + if (!current_mbctype) + had_num_literal = 0; } else set_list_bits(c, c, b); ただ、この (!current_mbctype || !had_num_literal) という条件の意図が どうしても読み取れませんでした。一応、had_num_literal というフラグの 変化は変更しないようにしましたが、また何か問題が出るかもしれません。 あと、今までできていたこんなことができなくなります。 修正前: p "\xc2\x80".scan(/\200/u) # => ["\302\200"] p "\xc4\x80".scan(/\400/u) # => ["\304\200"] 修正後: p "\xc2\x80".scan(/\200/u) # => [] p "\xc4\x80".scan(/\400/u) # => [] -- ---- - - - -- - うえの かつひろ