Techioz Blog

ルビに二重引用符を挿入するには gsub を使用します

概要

「foo&bar」を「foo」,「bar」に変換したいと思います。

gsubでこれをやろうとしていますが、うまくいきません。

2.3.0 :036 > string = "foo&bar"
 => "foo&bar"
2.3.0 :037 > string.gsub("&", "\"")
2.3.0 :038?>

あらゆる種類の特殊文字をエスケープしてみました。

解決策

さあ、どうぞ

2.2.3 :008 > string = "foo&bar"
 => "foo&bar" 
2.2.3 :009 > string = string.split('&')
 => ["foo", "bar"] 
2.2.3 :010 > string.to_s
 => "[\"foo\", \"bar\"]" 
2.2.3 :013 > string.to_s.gsub(/\[|\]/,'')
=> "\"foo\", \"bar\"" 

パフォーマンス向上のためのアップデート

私の友人の @engineersmnky がコメントで言ったように、double gsub の方が優れており、彼の言う通りです。ただし、パフォーマンスを向上させるためのさらに優れた方法があります。以下のベンチマークを参照してください。

require 'benchmark'

TO_TEST = 'foo&bar'.split('&').to_s * 999999

def replace_with_regex
  puts 'replace_with_regex: ' + (Benchmark.realtime { TO_TEST.gsub(/[\[\]]/, '') }).to_s
end

def replace_no_regex
  puts 'replace_no_regex: ' + (Benchmark.realtime { TO_TEST.gsub('[', '').gsub(']', '') }).to_s
end

def replace_with_delete
  puts 'replace_with_delete: ' + (Benchmark.realtime { TO_TEST.delete('[]') }).to_s
end

結果

replace_with_regex: 0.48356830099987747
replace_no_regex: 0.29740285399998356
replace_with_delete: 0.0289891009999792

したがって、.delete(‘[]’) を使用する必要があります。