[Ruby 1.9 - Bug #5208][Open] \b and \B don't match properly

Issue #5208 has been reported by Ken Takata.


Bug #5208: \b and \B don’t match properly

Author: Ken Takata
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]

初めまして、高田と申します。

\b, \Bが正しく単語境界、非単語境界にマッチしていません。
ruby 1.9.2では、\wがマルチバイト文字にマッチしないように鬼車を修正していたと思いますが、
\b, \Bについては\w, \Wに対応するように修正されていないようです。

実行例:
C:>type x.rb
#! ruby -Ks
p /\B/ =~ “あいうabc”
p $’
p /\b/ =~ “あいうabc”
p $’

C:>ruby x.rb
1
“いうabc”
0
“あいうabc”

期待する結果:
C:>ruby x.rb
0
“あいうabc”
3
“abc”

なお、私が公開している鬼車の改造版では、Perl 5.14に合わせて(?au)で\w等の
マルチバイト文字へのマッチを制御できるようにしています。

Issue #5208 has been updated by Yui NARUSE.

Status changed from Open to Assigned
Assignee set to Yui NARUSE

チケット登録ありがとうございます。
やり方はこれでバッチリです。

で、本件ですが、

ruby 1.9.2では、\wがマルチバイト文字にマッチしないように鬼車を修正していたと思いますが、
\b, \Bについては\w, \Wに対応するように修正されていないようです。
これって対応する必要あるんですかね。
Ruby では \w とは別に \p{Word} というものを用意しているので、「\b は \p{Word} に従う」でよいかと思っています。

Perl 5.14の /a /u は興味深いですね。
(?(cond)yes|no) とかも欲しいなぁと思っていたのと、最適化も欲しいので、
いっそ高田さんが Ruby の正規表現エンジンをメンテしてくださるとうれしいなぁと思っていたり。

Bug #5208: \b and \B don’t match properly

Author: Ken Takata
Status: Assigned
Priority: Normal
Assignee: Yui NARUSE
Category:
Target version:
ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]

初めまして、高田と申します。

\b, \Bが正しく単語境界、非単語境界にマッチしていません。
ruby 1.9.2では、\wがマルチバイト文字にマッチしないように鬼車を修正していたと思いますが、
\b, \Bについては\w, \Wに対応するように修正されていないようです。

実行例:
C:>type x.rb
#! ruby -Ks
p /\B/ =~ “あいうabc”
p $’
p /\b/ =~ “あいうabc”
p $’

C:>ruby x.rb
1
“いうabc”
0
“あいうabc”

期待する結果:
C:>ruby x.rb
0
“あいうabc”
3
“abc”

なお、私が公開している鬼車の改造版では、Perl 5.14に合わせて(?au)で\w等の
マルチバイト文字へのマッチを制御できるようにしています。

Issue #5208 has been updated by Ken Takata.

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

そういう考えもありましたか。ただ、少なくともPerl 5.14とPython 2.7では、
\b, \B は \w, \W と同期しており、(?u) などに応じて動作が変わります。(\p{Word}は固定)
それ以外の言語ではどうなっているか確認できていません。

(?(cond)yes|no) とかも欲しいなぁと思っていたのと、最適化も欲しいので、
いっそ高田さんが Ruby の正規表現エンジンをメンテしてくださるとうれしいなぁと思っていたり。

自分の改造版鬼車(鬼雲)をRubyに取り込んでいただく分には何の問題もないのですが、
Rubyの正規表現エンジン自体をメンテするのは手に負えそうにないです。
(特に、Rubyで独自に変更している部分をどうすべきかが課題。)

なお、Onigmo 5.10.6では以下のような機能が追加されています。
・正規表現

  • \K, \R, \X, (?(cond)yes|no), \g<0>, \g<+n>, (?au)
  • Perl 5.10互換の名前参照(←Rubyには不要でしょう。)
    ・Shift_JIS, EUC-JPで、全角アルファベットなどの大文字小文字同一視検索に対応。
    ・Shift_JIS, EUC-JPで、\p{Han}, \p{Latin}, \p{Greek}, \p{Cyrillic} に対応。
    ・最適化
  • 暗黙のアンカーによる最適化を実装。
  • Bug #3568: /(?<=a).*b/ =~ "aab" doesn't match - Ruby master - Ruby Issue Tracking System で無効化された最適化を再度有効化。

・Perl 5.14に比べた制限

  • (?(cond)yes|no) の条件に、先読み・戻り読み等が使えない。
  • (?|…), \o{nnn} 等は未対応。

Bug #5208: \b and \B don’t match properly

Author: Ken Takata
Status: Assigned
Priority: Normal
Assignee: Yui NARUSE
Category:
Target version:
ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]

初めまして、高田と申します。

\b, \Bが正しく単語境界、非単語境界にマッチしていません。
ruby 1.9.2では、\wがマルチバイト文字にマッチしないように鬼車を修正していたと思いますが、
\b, \Bについては\w, \Wに対応するように修正されていないようです。

実行例:
C:>type x.rb
#! ruby -Ks
p /\B/ =~ “あいうabc”
p $’
p /\b/ =~ “あいうabc”
p $’

C:>ruby x.rb
1
“いうabc”
0
“あいうabc”

期待する結果:
C:>ruby x.rb
0
“あいうabc”
3
“abc”

なお、私が公開している鬼車の改造版では、Perl 5.14に合わせて(?au)で\w等の
マルチバイト文字へのマッチを制御できるようにしています。

Issue #5208 has been updated by Yui NARUSE.

Status changed from Assigned to Rejected

Ken Takata wrote:

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

そういう考えもありましたか。ただ、少なくともPerl 5.14とPython 2.7では、
\b, \B は \w, \W と同期しており、(?u) などに応じて動作が変わります。(\p{Word}は固定)
それ以外の言語ではどうなっているか確認できていません。

考えたんですが 1.9 では現状のままとします。
/u /a が将来取り込まれたらその時に改めて考えましょう。

(?(cond)yes|no) とかも欲しいなぁと思っていたのと、最適化も欲しいので、
いっそ高田さんが Ruby の正規表現エンジンをメンテしてくださるとうれしいなぁと思っていたり。

自分の改造版鬼車(鬼雲)をRubyに取り込んでいただく分には何の問題もないのですが、
Rubyの正規表現エンジン自体をメンテするのは手に負えそうにないです。
(特に、Rubyで独自に変更している部分をどうすべきかが課題。)

あぁ、確かに不正なバイト列対策とか結構違いますからねぇ、残念です。
わたしも余裕があればマージしたいなぁとも思ってはいるんですが。

Bug #5208: \b and \B don’t match properly

Author: Ken Takata
Status: Rejected
Priority: Normal
Assignee: Yui NARUSE
Category:
Target version:
ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]

初めまして、高田と申します。

\b, \Bが正しく単語境界、非単語境界にマッチしていません。
ruby 1.9.2では、\wがマルチバイト文字にマッチしないように鬼車を修正していたと思いますが、
\b, \Bについては\w, \Wに対応するように修正されていないようです。

実行例:
C:>type x.rb
#! ruby -Ks
p /\B/ =~ “あいうabc”
p $’
p /\b/ =~ “あいうabc”
p $’

C:>ruby x.rb
1
“いうabc”
0
“あいうabc”

期待する結果:
C:>ruby x.rb
0
“あいうabc”
3
“abc”

なお、私が公開している鬼車の改造版では、Perl 5.14に合わせて(?au)で\w等の
マルチバイト文字へのマッチを制御できるようにしています。

Issue #5208 has been updated by Yui NARUSE.

Status changed from Rejected to Closed

Fixed by mergin Onigmo 5.13.1.

Bug #5208: \b and \B don’t match properly

Author: Ken Takata
Status: Closed
Priority: Normal
Assignee: Yui NARUSE
Category:
Target version:
ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]

初めまして、高田と申します。

\b, \Bが正しく単語境界、非単語境界にマッチしていません。
ruby 1.9.2では、\wがマルチバイト文字にマッチしないように鬼車を修正していたと思いますが、
\b, \Bについては\w, \Wに対応するように修正されていないようです。

実行例:
C:>type x.rb
#! ruby -Ks
p /\B/ =~ “あいうabc”
p $’
p /\b/ =~ “あいうabc”
p $’

C:>ruby x.rb
1
“いうabc”
0
“あいうabc”

期待する結果:
C:>ruby x.rb
0
“あいうabc”
3
“abc”

なお、私が公開している鬼車の改造版では、Perl 5.14に合わせて(?au)で\w等の
マルチバイト文字へのマッチを制御できるようにしています。

Issue #5208 has been updated by Ken Takata.

今回は見送りという点については仕方ないと思います。

マージについてですが、とりあえずOnigmo 5.11.2とRubyの鬼車をマージしたものを作ってみました。
https://github.com/k-takata/Onigmo/tree/tmp/ruby-1.9.x
Rubyのビルド環境は用意していないので、Rubyに組み込んでの確認はできていません。
どなたか組み込んで動作確認していただけると幸いです。

Bug #5208: \b and \B don’t match properly

Author: Ken Takata
Status: Rejected
Priority: Normal
Assignee: Yui NARUSE
Category:
Target version:
ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]

初めまして、高田と申します。

\b, \Bが正しく単語境界、非単語境界にマッチしていません。
ruby 1.9.2では、\wがマルチバイト文字にマッチしないように鬼車を修正していたと思いますが、
\b, \Bについては\w, \Wに対応するように修正されていないようです。

実行例:
C:>type x.rb
#! ruby -Ks
p /\B/ =~ “あいうabc”
p $’
p /\b/ =~ “あいうabc”
p $’

C:>ruby x.rb
1
“いうabc”
0
“あいうabc”

期待する結果:
C:>ruby x.rb
0
“あいうabc”
3
“abc”

なお、私が公開している鬼車の改造版では、Perl 5.14に合わせて(?au)で\w等の
マルチバイト文字へのマッチを制御できるようにしています。