2011-11-01 9 views

Respuesta

86

Uso #sub:

a.sub('bar', "BAR") 
+3

¡gracias! Estaba usando gsub() que reemplaza todas las apariciones. – Sayuj

11

String#sub es lo que necesita, como ya se dijo Yossi. Pero me gustaría usar una expresión regular en su lugar, ya que es más rápido:

a = 'foobarfoobarhmm' 
output = a.sub(/foo/, 'BAR') 
+0

Acabo de hacer un punto de referencia y regex toma un 50% más de tiempo que simplemente usar una cadena como parámetro para el sub. –

+0

Lo comprobé y la versión de Regexp es más rápida. Usé MRI 1.9.2, 1.9.3, 2.0.0 e incluso JRuby, todos ellos más rápidos en la versión Regexp. El código de referencia: https://gist.github.com/tbuehlmann/5574713 ¿Desea proporcionar su punto de referencia? – tbuehlmann

+0

Hmmmm. Debo disculparme por mi afirmación, parece que cometí un error en mi punto de referencia. La expresión regular es más rápida. –

5

para reemplazar la primera ocurrencia, simplemente hacer esto:

str = "Hello World" 
str['Hello'] = 'Goodbye' 
# the result is 'Goodbye World' 

incluso se puede utilizar expresiones regulares:

str = "I have 20 dollars" 
str[/\d+/] = 500.to_s 
# will give 'I have 500 dollars' 
+0

'500.to_s' a veces se escribe' "500" '. :-) –

+1

Lo escribí así intencionalmente. para indicar que necesita asignar una cadena explícita. Porque la conversión no es automática aquí. Si haces esto en vez de 'str [/ \ d + /] = 500', obtendrás un error' TypeError: no hay conversión implícita de Fixnum en String'. –

Cuestiones relacionadas