2010-07-02 12 views
14

en Python, podemos utilizar el método .strip() de una cadena para eliminar iniciales o finales apariciones de personajes elegidos:Rubí tira cadena caracteres definidos

>>>print " (Removes (only) leading & trailing brackets & ws) ".strip("()") 
'Removes (only) leading & trailing brackets & ws'

¿Cómo hacemos esto en Ruby? El método strip de Ruby no toma argumentos y solo elimina el espacio en blanco.

Respuesta

11

No hay tal método en el rubí, pero se puede definir fácilmente se siente:

def my_strip(string, chars) 
    chars = Regexp.escape(chars) 
    string.gsub(/\A[#{chars}]+|[#{chars}]+\z/, "") 
end 

my_strip " [la[]la] ", " []" 
#=> "la[]la" 
+0

+1: Me gusta esto. También parece que '# {chars}' escapa automágicamente a los metacaracteres de expresiones regulares, ¿es así? Si solo fuera una sustitución de cadena, la expresión regular no debería funcionar en tu ejemplo. Sin embargo, es posible que desee utilizar '\ A' y' \ Z' en lugar de '^' y '$' - estos últimos también coincidirán con las líneas nuevas que podrían no ser deseables. –

+0

@Tim: '# {}' no escapa - es por eso que tengo la llamada a Regexp.escape allí. Buen punto sobre \ A y \ Z. – sepp2k

+0

Oh. Mi culpa - (wer lesen kann, ist klar im Vorteil). –

0

Prueba el método gsub:

irb(main):001:0> "[foo ]".gsub(/\As+[/,'') 
=> "foo ]" 

irb(main):001:0> "foo ]".gsub(/s+]\Z/,'') 
=> "foo" 

etc.

+1

Esta, como todas las otras respuestas, elimina todas las apariciones de los caracteres dados. El OP solo quiere eliminar las ocurrencias en cualquier extremo de la cadena (como Strip, pero no solo para espacios en blanco). – sepp2k

+0

Vaya, pensó^coincidió con el comienzo de la cadena. Cambiado – Peter

+0

@Peter: en realidad no vi el^(que podría ser porque estaba delante de la apertura '/' en lugar de detrás). Pero '\ A' es más correcto, sí. +1 – sepp2k

3
"[[ ] foo [] boo ][ ]".gsub(/\A[ \[\]]+|[ \[\]]+\Z/,'') 
=> "foo [] boo" 
Puede también

ser cortocircuito a

"[[ ] foo [] boo ][ ]".gsub(/\A[][ ]+|[][ ]+\Z/,'') 
=> "foo [] boo" 
2

No hay tal método en el rubí, pero se puede definir fácilmente se siente:

class String 
    alias strip_ws strip 
    def strip chr=nil 
     return self.strip_ws if chr.nil? 
     self.gsub /^[#{Regexp.escape(chr)}]*|[#{Regexp.escape(chr)}]*$/, '' 
    end 
end 

que satisfaga los requisitos solicitados:

> "[ [] foo [] boo [][]] ".strip(" []") 
=> "foo [] boo" 

sin dejar de hacer lo que se espera en circunstancias menos extremas.

> ' _bar_ '.strip.strip('_') 
=> "bar" 

nJoy!

2

Prueba el String#delete método: (disponibles en 1.9.3, no está seguro acerca de otras versiones)

Ex:

1.9.3-p484 :003 > "hehhhy".delete("h") 
    => "ey" 
+6

Esto no es lo que pidió la pregunta. –