Bug #5208
closed\b and \B don't match properly
Description
初めまして、高田と申します。
\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等の
マルチバイト文字へのマッチを制御できるようにしています。
https://github.com/k-takata/Onigmo
Updated by naruse (Yui NARUSE) over 13 years ago
- Status changed from Open to Assigned
- Assignee set to naruse (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 の正規表現エンジンをメンテしてくださるとうれしいなぁと思っていたり。
Updated by k_takata (Ken Takata) over 13 years ago
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} に対応。
・最適化
- 暗黙のアンカーによる最適化を実装。
- http://redmine.ruby-lang.org/issues/3568 で無効化された最適化を再度有効化。
・Perl 5.14に比べた制限
- (?(cond)yes|no) の条件に、先読み・戻り読み等が使えない。
- (?|...), \o{nnn} 等は未対応。
Updated by naruse (Yui NARUSE) over 13 years ago
- 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で独自に変更している部分をどうすべきかが課題。)
あぁ、確かに不正なバイト列対策とか結構違いますからねぇ、残念です。
わたしも余裕があればマージしたいなぁとも思ってはいるんですが。
Updated by k_takata (Ken Takata) over 13 years ago
今回は見送りという点については仕方ないと思います。
マージについてですが、とりあえずOnigmo 5.11.2とRubyの鬼車をマージしたものを作ってみました。
https://github.com/k-takata/Onigmo/tree/tmp/ruby-1.9.x
Rubyのビルド環境は用意していないので、Rubyに組み込んでの確認はできていません。
どなたか組み込んで動作確認していただけると幸いです。
Updated by naruse (Yui NARUSE) almost 13 years ago
- Status changed from Rejected to Closed
Fixed by merging Onigmo 5.13.1.