2011-11-18 12 views
13

que tienen una variable de cadena en Ruby de la siguiente manera:¿Cómo obtener la primera línea de String en Ruby?

puts $varString.class 
puts "##########" 
puts $varString 

la salida del código anterior es:

String 
########## 
my::FIrst::Line 
this id second line 
sjdf kjsdfh jsdf 
djsf sdk fxdj 

que necesito para obtener sólo la primera línea de la variable de cadena (por ejemplo my::FIrst::Line) . ¿Cómo puedo obtenerlo?

Respuesta

32
# Ruby >= 1.8.7 
$varString.lines.first 
# => "my::FIrst::Line" 

# Ruby < 1.8.7 
$varString.split("\n").first 
# => "my::FIrst::Line" 

Como nota al margen, evite utilizar los $ (señal) variables globales.

+0

Esto fue útil para un proyecto en 1.8.6 (que no admite #lines) – Mikey

1
puts $varString.split('\n')[0] 

divide la cadena en '\ n' fichas, y obtener la primera

28
$varString.lines.first 

O, si usted quiere deshacerse de salto de línea final en que resulta cadena:

$varString.lines.first.chomp 
+4

+1 para el uso de '# líneas' –

4
str = <<DOC1 
asrg 
aeg 
aegfr 
DOC1 

puts str[0..(str.index("\n")|| -1)] 

Evita leer toda la cadena en una matriz. (El || -1 evita un error si no hay final de línea en la cadena). EDITAR str.lines no crea una matriz.

+0

+1 porque esto debería ser más rápido, aunque es un poco más .. . me atrevo a decir ... Perl-ish, porque aumenta el ruido de la línea. :-) Si se trata de una gran cantidad de texto o líneas largas, podría ser MUCHO más rápido que la división o el uso de 'líneas'. Recomiendo agregar algunos puntos de referencia a su respuesta para mostrar el beneficio. –

+1

@the Tin Man Bench, lo hizo contra "líneas" y no encontró ninguna diferencia, sin importar el tamaño de la cuerda. Resulta que 'lines' no devuelve una matriz sino un enumerador (¡mucho mejor!). Así que ahora creo que la respuesta de @Victor Deryagin es la mejor. – steenslag

+2

No será más rápido que 'lines', porque, como has encontrado,' lines' es un enumerador. Será mucho más rápido que cualquier solución, como 'split', que crea una matriz, especialmente cuando la matriz resultante es grande. –

0

Una respuesta alternativa a @ steenslag sería usar StringIO para obtener solo la primera línea.

str = <<DOC1 
asrg 
aeg 
aegfr 
DOC1 

puts StringIO.open(str, &:readline) 

Si la cadena es enorme, esto evita dividir la cadena en una matriz grande y solo lee la primera línea. Tenga en cuenta que arroja un EOFError si la cadena está vacía.

Cuestiones relacionadas