From: Tadashi Saito Date: 2010-10-23T14:58:46+09:00 Subject: [ruby-dev:42448] Re: 正規表現に半角スペースが混じっている際の挙動 斎藤と申します。 文字列がどうパースされているか分からなくなった時、Ruby1.9世代の我々には、Ripperと いう強力な武器があるのをお忘れなく。エラーになるような受理されない文字列ではダメですが、 受理される場合は On Fri, 22 Oct 2010 19:55:59 +0900 Akira Matsuda wrote: > % ruby -e "'hoge'.scan / /" % ruby -r{pp,ripper} -e "pp Ripper.sexp(%q('hoge'.scan / /))" [:program, [[:binary, # <= 二項演算子!! [:call, [:string_literal, [:string_content, [:@tstring_content, "hoge", [1, 1]]]], :".", [:@ident, "scan", [1, 7]]], :/, # <= 中置の :/ 、Regexpと見られてない [:regexp_literal, [], nil]]]] > # カッコを付ければエラーにならない > % ruby -e "'hoge'.scan(/ /)" % ruby -r{pp,ripper} -e "pp Ripper.sexp(%q('hoge'.scan(/ /)))" [:program, [[:method_add_arg, [:call, [:string_literal, [:string_content, [:@tstring_content, "hoge", [1, 1]]]], :".", [:@ident, "scan", [1, 7]]], [:arg_paren, [:args_add_block, [[:regexp_literal, [[:@tstring_content, " ", [1, 13]]], [:@regexp_end, "/", [1, 14]]]], false]]]]] > # エスケープすればエラーにならない > % ruby -e "'hoge'.scan /\ */" % ruby -r{pp,ripper} -e "pp Ripper.sexp(%q('hoge'.scan /\ */ ))" [:program, [[:command_call, [:string_literal, [:string_content, [:@tstring_content, "hoge", [1, 1]]]], :".", [:@ident, "scan", [1, 7]], [:args_add_block, [[:regexp_literal, [[:@tstring_content, "\\ *", [1, 13]]], [:@regexp_end, "/", [1, 16]]]], false]]]] と、各々鮮やかに結果を返してくれます。 ぜひみんなで、Ripperをかわいがりましょう。 # もっと細かく見たければ、--yydebugという禁じられたオプションもありますね -- 斎藤ただし