From: Yui NARUSE Date: 2009-08-05T12:30:42+09:00 Subject: [ruby-dev:39020] [Bug #1503] -Kuをつけた時、/[#{s}]/n と Regexp.new("[#{s}]",nil,"n") で実行結果が異なる チケット #1503 が更新されました。 (by Yui NARUSE) /.../nは、内側の文字列をASCII-8BITとしてみなして正規表現にするリテラルではなく、 ASCII-8BITな正規表現を作るためのリテラルなのが根本的な理由です。 よって、そもそもの動機として、/あ/nといった書き方はやめさせたいと思っています。 理由は、その正規表現が書かれたソースコードのencodingが変換された場合に、 生成される正規表現が意図せずして変わる可能性があるからです。 また、先述のASCII-8BITな正規表現リテラルという趣旨にたいして、 素の文字を書かれるのはこれに反します。 次に/#{"foo"}/のように埋め込むものがリテラルの場合、 このコードはパーサレベルで/foo/のように、1つのリテラルに置き換えられています。 つまり、実行時にこの2つは区別することができないので、引きずられてエラーが出ます。 もっとも、たとえ区別できたとしてもこのような方法で回避できるような、 いかにもバッドノウハウ的な挙動は許さないでしょう。 さて、やっと本題です。 /#{s}/nと2番目の違いは埋め込むものがリテラルか変数かの違いです。 この違いが影響することも、結局は埋め込み式であってもリテラルの生成なので本意ではありません。 ただ、エラーメッセージは微妙に先の場合とは変えてあります。 あわせて、「invalid multibyte character (ArgumentError)」というメッセージも、 RegexpError: /.../n has a non escaped non ASCII character in non ASCII-8BIT script に変えています。 ---------------------------------------- http://redmine.ruby-lang.org/issues/show/1503 ---------------------------------------- http://redmine.ruby-lang.org