文字と数字が交互に並んでいます。私は各文字をそれに先行する文字数で置き換えたい。たとえば、2a3b
はaabbb
を返します。ルビー正規表現のスキャンとgsubは、ブロック内のキャプチャグループとは異なる働きをします。
まず、私が行う場合:
"2a3b".scan(/(\d)(.)/) do |count, char|
puts char * count.to_i
end
私が手に:私がしなければ、
aa
bbb
しかし:
"2a3b".gsub(/(\d)(.)/) do |count, char|
char * count.to_i
end
私はエラーを取得する:
NoMethodError: undefined method `*' for nil:NilClass
どちらも同じように動作してはいけませんか?(アップデート:キャプチャグループをブロックパラメータとして受け入れますか?
更新:(回避策、動作)
"2a3b".gsub(/(\d)(.)/) do |match|
$2 * $1.to_i
end
戻り値:
"aabbb"
予想通り。
私は両方のアプローチが本当に好きです。しかし、私は「アップデート」が不要であると感じています。また、以下の回答を減らすので、元の質問に戻すのが最良です。 –
@ sagarpandya82最初の更新は、ある回答が私の質問を完全に誤解しているため、私の意図を明確にしています。 2回目の更新は、最初の回答が来る前に行われました。 – Anand
この[リンク](http://batsov.com/articles/2013/08/30/using-gsub-with-a-block/)はうまく言っています。*一部の人々は、gsubがすべての一致するグループを引数として指定します。そうでない場合は、正規表現全体を表す単一の引数が常に得られます。* – Anand