[ruby-list:50672] Re: [質問] キャプチャ付き正規表現の後方参照

From: Takahiro Yamaguchi <yamataka@...08.itscom.net>
Date: 2018-06-04 06:14:09 UTC
List: ruby-list #50672
市田さん

ご教示ありがとうございます。

>> $ cat regex.rb
>> tbl_cmd = [
>>  { regexp:       '^ *v +(\d+) *$',
>>    cmd:          ":direct #{$1}"},
>> ]
> 
>> p c[:cmd] の、c[:cmd]  の、$1 部分、
>> でキャプチャした内容を後方参照できずに、悩んでいます。
> 
> ":direct #{$1}" の中の$1 はtbl_cmd の定義を「実行」する際に展開されるためでは?

メーリングリストでサポートなさそうな感じがしたので、teratail でサポートを受け、
同様に、展開される事を教示いただきました。

> 式展開の実行そのものを遅延させるには eval が利用できそうですが、

$ cat ./regexp.rb 
tbl_cmd = [ 
  { regexp:       '^ *v +(\d+) *$',
    cmd:          '":direct #{$1}"’}, # シングルクォートで括る
]

cmd = STDIN.gets # $ v 5
tbl_cmd.each do |c|
  if /#{c[:regexp]}/ =~ cmd
    puts "match"     # => match
    p $1                  # => "5"
    p c[:cmd]          # => "\":direct \#{$1}\"" 
    p eval(c[:cmd]) # => ":direct 5”  eval を利用
  end
end

$ ruby ./regexp.rb 
v 5
match
"5"
"\":direct \#{$1}\""
":direct 5”

> ユーザの入力をそのまま式展開するような使用方法は危険なため、一般には推奨されないと思います。

セキュリティ的にですかね。そこまでは気が回りませんでした。勉強になりました。

> ユーザの入力をそのまま式展開するような使用方法は危険なため

その様な使用方法にしない様にするには、

v は、コマンド
5 は、配列の添字番号
なのですが…

どの様に記述すればいいのですか?



In This Thread