• ベストアンサー

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

  • ruby 正規表現について教えてください。

    aというテキストファイルを読み込むときの処理なんですが、 aというテキストファイルは↓のようになってます。 #AA1#(001-1 001-2 001-3) #AA2#(pro pro) #AA3#(num1) #AA1#(002-1 002-2 002-3) #AA2#(dro dro) #AA3#(num2) このファイルから#AA1#の()でくくった部分を縦に並べて、その横に#AA3#の()でくくった部分を縦で表示させたいんです。 実行結果を下のようにしたいです。 001-1 num1 001-2 num1 001-3 num1 002-1 num2 002-2 num2 002-3 num2 一応がんばって、下のように考えたんですが、上手く実行できないです。どうか、回答おねがいします。 a= [] b = [] c = [] while line = gets if /#AA1#\((.*\s)(.*\s)(.*)\)/ =~ line a.push $1 a.push $2 a.push $3 end if/#AA3#\((.*)\)/ =~ line b.push $1 end end c = [a,b] puts c

  • Rubyの正規表現を引数に

    お世話になっています。 Rubyの正規表現を引数にできないものでしょうか? def chkStr(sReg) #正規表現にかける if regexp = sReg      ・・・ end end sReg = ~ /\t(国語|数学)/ chkStr(sReg) みたいなことがしたいのです。 宜しくお願いします。

  • 正規表現内での変数の扱いに関して

    正規表現内での変数の扱いに関して あるの変数の文字列が別の変数の文字列を冒頭に含むかどうか判別した上でその差分を抽出するコードを書こうとしています。 $a='komekoron'; $b='kome'; if($a=~/^$b(.+)$/){print $1}; このコードを実行すると「koron」が出力されます。 同様に以下のコードで「:」を出力させたいのですが上手くいきません。 $a='*:'; $b='*'; if($a=~/^$b(.+)$/){print $1}; 出力内容は「*:」 これは変数内の文字列がパタンとして扱われているのでしょうか。どうすれば意図する動作になるでしょうか。ご教授願います。

    • ベストアンサー
    • Perl
  • javascriptの正規表現で変数を扱う

    javascriptの正規表現で変数を扱う方法がわからずに困っております。 下記スクリプトの●●●部分に変数をいれるとしたら、 どうすれば良いでしょうか? どなたかご教授ください。 宜しくお願いいたします。 if(/(?:^|\s)●●●(?:$|\s)/.test(obj.className)){

  • これは正規表現とは言えないでしょうか?

    正規表現を勉強しようと思っているのですが まずはじめに確認させて下さい。VBAです。 Sub 正規表現() If a Like "*a*" Then End If End Sub は正規表現とは言えないでしょうか? *を使っているからそう思いました。 Dim re As RegExp Set re = New RegExp を使わないと、正規表現といえないのでしょうか? よろしくお願い致します。

  • 正規表現

    変数$aのなかに変数$bが含まれていたらをperlの正規表現であらわすと どのようになるのでしょうか?if($a=~ /$b/)ではうまくいかないのですか?

    • ベストアンサー
    • Perl
  • Ruby 正規表現による文章取得

    こんばんは。 最近正規表現を用いたスクローリングを行っているのですが、 その中でうまく動かない部分があったため質問させていただきました。 プログラムは以下の通りです。 text = "" data = Dir.glob("/home/edinet/**/*.html") data.each do |find| flag = nil IO.foreach(find) do |line2| case line2 when /保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目/ flag = true when /保有目的が純投資目的である投資株式の前事業年度|保有目的が純投資目的|普通株式/ flag = false end text << line2.chomp if flag == true end print text end >保有目的が純投資目的である投資株式の前事業年度|保有目的が純投資目的|普通株式 この3つのどれかが含まれている場合にfalseを返し、文字列の取得が終了するはずなのですが、「普通株式」が含まれている行以降も文字列を取得し続けてしまいます。 正規表現が間違っているためなのでしょうか? ご回答の程どうかよろしくお願い致します。

  • split と 正規表現による分割

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=964020 にて同じような質問をしたのですが、ご回答と自分での検証で食い違いが起きたので質問させていただきます。 splitを用いた分割と正規表現を用いた分割のどちらが速いかというものです。 #####test.txt### ... <!--line--> ... <!--line--> .... ################ というファイルを$lineという変数に入れ、 ********************************************** sub seiki { my $a,$b,$c; if($line=~ /(.*)<!--line-->\n(.*)<!--line-->\n(.*)/s){ $a=$1; $b=$2; $c=$3; } ********************************************** と ********************************************** sub split { my($a,$b,$c){split("<!--line-->\n",$line);} } ********************************************** をBenchmarkモジュールを用いて、速度比較をしてみたところ、splitの方が4倍程速い結果が出ました。実際に用いたtest.txtのサイズは10KBです。 前回質問したときのご回答では、正規表現のほうが早いというご意見をいただいたのですが、本当のところはどちらなのでしょうか

    • ベストアンサー
    • Perl
  • 正規表現

    正規表現のパターンを変数内に入れて評価することは 可能なんでしょうか? たとえば、 my $value = " 0123"; my $patern = "\s.+"; if( $value =~ /$patern/ ) ~略~ のような感じです。

    • ベストアンサー
    • Perl
  • perlにおける正規表現で、パターンに変数を使う場合について教えてください。

    変数と変数を正規表現にて比較する場合に、 if ($text =~ /$pattern/) { ... } とすると、「$pattern」を変数として認識しません。 「$」が位置指定子として認識されている?ようです。 「$pattern」を変数として認識させるにはどのようにすればよいのでしょうか? 「\$pattern」のように「\(バックスラッシュ)」を入れても認識されませんでした。

    • ベストアンサー
    • Perl

専門家に質問してみよう