Ruby 1.9(鬼車)では\bが\wと\Wの間にマッチしない(2.0以降の鬼雲も)

$ ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin10.8.0]

1.8とは違って1.9では\wに全角文字が含まれません。

pry(main)> str = "あいうabc"
=> "あいうabc"
pry(main)> str[/\w+/]
=> "abc"
pry(main)> str[/\W+/]
=> "あいう"

\bは\wと\Wの間にマッチする幅のないもの、とされていたはず。

では「あいう」と「abc」の間に\bがマッチするはず…ですが、しません

\bが^にマッチしてますね。

pry(main)> str[/\b/]
=> ""
pry(main)> $`
=> ""
pry(main)> $'
=> "あいうabc"

状況

\b, \Bが正しく単語境界、非単語境界にマッチしていません。
ruby 1.9.2では、\wがマルチバイト文字にマッチしないように鬼車を修正していたと思いますが、
\b, \Bについては\w, \Wに対応するように修正されていないようです。
なお、私が公開している鬼車の改造版では、Perl 5.14に合わせて(?au)で\w等の
マルチバイト文字へのマッチを制御できるようにしています。
https://github.com/k-takata/Onigmo



Ruby では \w とは別に \p{Word} というものを用意しているので、「\b は \p{Word} に従う」でよいかと思っています。

そういう考えもありましたか。ただ、少なくともPerl 5.14とPython 2.7では、
\b, \B は \w, \W と同期しており、(?u) などに応じて動作が変わります。(\p{Word}は固定)
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/44410(Date: Tue, 23 Aug 2011 00:33:58 +0900)

なお\p{Word}は全角半角の(記号以外の)文字にマッチします。

pry(main)> str2 = "あいうabc1212&えお"
=> "あいうabc1212&えお"
pry(main)> str2[/\p{Word}+/]
=> "あいうabc1212"

Ruby 2.0ではどうなったんでしょう(さわってないし調べてない)

  • 組み込みライブラリ
    • Onigmo (鬼雲): 新しい正規表現エンジン (鬼車の fork)

るびま

とあるから、上記の差異は解決されたのかな
確認してみました。

$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin13.0.2]
[1] pry(main)> str = "あいうabc"
=> "あいうabc"
[2] pry(main)> str[/\w+/]
=> "abc"
[3] pry(main)> str[/\W+/]
=> "あいう"
[4] pry(main)> str[/\b/]
=> ""
[5] pry(main)> $`
=> ""
[6] pry(main)> $'
=> "あいうabc"

ということで、1.9.3と同じく\bは\wと\Wの間にマッチしません。うーむ。