`The rubyist'【えぬ】の日記

2013-07-14

Ruby 2.0の正規表現 \K のバグ?(11/2追記) Ruby 2.0の正規表現 \K のバグ?(11/2追記) - `The rubyist'【えぬ】の日記 を含むブックマーク はてなブックマーク - Ruby 2.0の正規表現 \K のバグ?(11/2追記) - `The rubyist'【えぬ】の日記

Ruby 2.0からOnigmoが採用され、新たなメタキャラクタ「\K」が使えるようになった。

http://doc.ruby-lang.org/ja/2.0.0/doc/spec=2fregexp.html の「先読み、後読み(lookahead, lookbehind)」を参照。

しかしこの\K、Regexp#gsub と使うと何か挙動がおかしい。

% irb-ruby-2.0.0-p247
2.0.0p247 :001 > a="foobarbazquux/foobarbazquux"
 => "foobarbazquux/foobarbazquux"
2.0.0p247 :002 > a.sub(/foo\Kbar/, "")
 => "foobazquux/foobarbazquux"
2.0.0p247 :003 > a.gsub(/foo\Kbar/, "")
 => "bazquux/bazquux"

\Kの採用元であるPerlの方は期待通りの挙動を示している。

% perl --version|head -2

This is perl 5, version 16, subversion 3 (v5.16.3) built for i686-linux
% tinyrepl
re.pl$ my $a = "foobarbazquux/foobarbazquux";
"foobarbazquux/foobarbazquux"
re.pl$ $a =~ s/foo\Kbar//r;
"foobazquux/foobarbazquux"
re.pl$ $a =~ s/foo\Kbar//gr;
"foobazquux/foobazquux"

11/2追記

2.1.0-preview1で直ったようです。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/47694

https://bugs.ruby-lang.org/issues/8856

% irb-ruby-2.1.0-preview1
irb(main):001:0> a="foobarbazquux/foobarbazquux"
=> "foobarbazquux/foobarbazquux"
irb(main):002:0> a.sub(/foo\Kbar/, "")
=> "foobazquux/foobarbazquux"
irb(main):003:0> a.gsub(/foo\Kbar/, "")
=> "foobazquux/foobazquux"

パッチ見る限り、Onigmoは関係なかったようで。

https://github.com/ruby/ruby/commit/b31965cb43e8f6117435acf6f676cb9a4417afff

Onigmoの方を疑ってしまい申し訳ありませんでした。