rails - ruby replace regex
Reemplazo de cadena múltiple de rubí (6)
Configurar una tabla de mapeo:
map = {''☺'' => '':)'', ''☹'' => '':('' }
A continuación, construir una expresión regular:
re = Regexp.new(map.keys.map { |x| Regexp.escape(x) }.join(''|''))
Y por último, gsub
:
s = str.gsub(re, map)
Si estás atrapado en tierra 1.8, entonces:
s = str.gsub(re) { |m| map[m] }
Necesita el Regexp.escape
allí en caso de que cualquier cosa que quiera reemplazar tenga un significado especial dentro de una expresión regular. O bien, gracias a steenslag, podrías usar:
re = Regexp.union(map.keys)
Y la cotización será atendida por usted.
str = "Hello☺ World☹"
La salida esperada es:
"Hello:) World:("
Puedo hacer esto: str.gsub("☺", ":)").gsub("☹", ":(")
¿Hay alguna otra manera para que pueda hacer esto en una sola llamada de función? Algo como:
str.gsub([''s1'', ''s2''], [''r1'', ''r2''])
Desde Ruby 1.9.2, String#gsub
acepta el hash como un segundo parámetro para el reemplazo con claves coincidentes. Puede utilizar una expresión regular para que coincida con la subcadena que debe reemplazarse y pase el hash para que se reemplacen los valores.
Me gusta esto:
''hello''.gsub(/[eo]/, ''e'' => 3, ''o'' => ''*'') #=> "h3ll*"
''(0) 123-123.123''.gsub(/[()-,. ]/, '''') #=> "0123123123"
En Ruby 1.8.7, lograrías lo mismo con un bloque:
dict = { ''e'' => 3, ''o'' => ''*'' }
''hello''.gsub /[eo]/ do |match|
dict[match.to_s]
end #=> "h3ll*"
Llegó tarde a la fiesta, pero si quisiera reemplazar ciertos caracteres por uno, podría usar un regex
string_to_replace.gsub(/_|,| /, ''-'')
En este ejemplo, gsub está reemplazando los guiones bajos (_), comas (,) o () con un guión (-)
Otra forma simple y fácil de leer es la siguiente:
str = ''12 ene 2013''
map = {''ene'' => ''jan'', ''abr''=>''apr'', ''dic''=>''dec''}
map.each {|k,v| str.sub!(k,v)}
puts str # ''12 jan 2013''
Podrías hacer algo como esto:
replacements = [ ["☺", ":)"], ["☹", ":("] ]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
Puede haber una solución más eficiente, pero esto al menos hace que el código sea un poco más limpio
También puede usar tr para reemplazar varios caracteres en una cadena a la vez,
Por ejemplo, reemplaza "h" por "m" y "l" por "t"
"hello".tr("hl", "mt")
=> "metto"
parece simple, ordenado y más rápido (aunque no hay mucha diferencia) que gsub
puts Benchmark.measure {"hello".tr("hl", "mt") }
0.000000 0.000000 0.000000 ( 0.000007)
puts Benchmark.measure{"hello".gsub(/[hl]/, ''h'' => ''m'', ''l'' => ''t'') }
0.000000 0.000000 0.000000 ( 0.000021)