[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 は、配列の添字番号
なのですが…
どの様に記述すればいいのですか?