2011-09-23 19 views
11

¿Cómo devuelve la parte de una cadena hasta la primera instancia de " #" o " Apt"?Devolver cadena hasta cadena coincidente en Ruby

Sé que podría dividir la cadena en una matriz basada en "#" o "Apt" y luego llamar a .first, pero debe haber una manera más simple.

+0

¿Por qué no es así de simple? –

Respuesta

21

La división de cadenas es definitivamente más fácil y legible que una expresión regular. Para la expresión regular, necesitarías un grupo de captura para obtener la primera coincidencia. Será lo mismo que la cadena división

string.split(/#|Apt/).first 
+3

Valdría al menos pasar '2' como el segundo argumento a' split' (lo que significa: dividir en un máximo de dos piezas) ya que solo quiere el primer resultado. De lo contrario, esto podría hacer mucho más trabajo de lo necesario. –

1

no escribo en rubí casi nada, pero estoy seguro de que podría utilizar una expresión regular a lo largo de las líneas de

^.*(#|Apt) 

O, si se pone la cadena en un tokenizer, usted podría Haga algo con eso, pero sería más difícil teniendo en cuenta que está buscando una palabra y no solo un solo personaje.

2

Uso String#[] método. De esta manera:

[ 
    '#foo', 
    'foo#bar', 
    'fooAptbar', 
    'asdfApt' 
].map { |str| str[/^(.*)(#|Apt)/, 1] } #=> ["", "foo", "foo", "asdf"] 
3

Escribo un método para que quede claro. Algo como esto, por ejemplo:

class String 
    def substring_until(substring) 
     i = index(substring) 
     return self if i.nil? 
     i == 0 ? "" : self[0..(i - 1)] 
    end 
end 
Cuestiones relacionadas