• ベストアンサー

Rubyの変数を含んだ正規表現について

下のように正規表現でlineと 1=,2=などから始まる行を抽出する プログラムですが、どうやら正規表現の左辺(//の中身) には変数は使えないようです。iが文字として 認識されているようです。 解決策を教えてください。 while line = io.gets  20.times{ |i|   if /^i=(.*)/ =~ line   p $1  } end

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

if /^i=(.*)/ =~ line を if /^#{i}=(.*)/ =~ line として下さい。#{i}とすることにより、iが変数展開されます。 蛇足ですが、提示されたスクリプトは実行時エラーになります。正しい、スクリプトを期待する場合は、その旨補足下さい。

その他の回答 (2)

  • Bo_Bo
  • ベストアンサー率65% (97/149)
回答No.3

# 式展開 => #{式} var = "world" puts "hello #{var}" #=> hello world puts "1 + 1 は、#{1 + 1} です。" #=> 1 + 1 は、2 です。 while line = DATA.gets  # 行数 × イテレータ回数分の正規表現を生成しなくてはならないので、  # 効率が悪いと思う。  20.times{|i|   if /^#{i}=(.*)/ =~ line    puts "typeA: #{$1}"   end  }  # 正規表現を工夫して、o オプションを付ければ、  # 一度の式展開で済ますことが出来る。(以下は例文です)  if /^1?\d=(.*)/o =~ line   puts "typeB: #{$1}"  end end exit __END__ 1=aaa 2=bbb XXXXXX 13=ccc 25=YYYYYY 14=ddd 5= 6=eee 30=ZZZZZZ 17=fff

回答No.1

「式展開」ってのを、調べてみるとよいかと。

参考URL:
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%A5%EA%A5%C6%A5%E9%A5%EB#a.bc.b0.c5.b8.b3.ab

関連するQ&A