2011-11-18 16 views
13

Ho una variabile stringa in Ruby come segue:Come ottenere la prima riga da String in Ruby?

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

l'output del codice precedente è:

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

devo ottenere solo la prima riga della variabile stringa (es my::FIrst::Line) . Come posso ottenerlo?

risposta

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

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

Come nota a margine, evitare di utilizzare (i $ segno) le variabili globali.

+0

Questo è stato utile per un progetto in 1.8.6 (che non supporta #lines) – Mikey

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

suddivide la stringa su '\ n' gettoni, e ottenere il primo

28
$varString.lines.first 

Oppure, se si vuole sbarazzarsi di nuova riga finale nella stringa risultante:

$varString.lines.first.chomp 
+4

+1 per l'uso di '# lines' –

4
str = <<DOC1 
asrg 
aeg 
aegfr 
DOC1 

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

Evita di leggere l'intera stringa in una matrice. (Il || -1 evita un errore se non ci sono linee che finiscono nella stringa). EDIT str.lines non crea una matrice.

+0

+1 perché dovrebbe essere più veloce, anche se è un po 'più .. oserei dirlo ... Perl-ish, perché aumenta il rumore della linea. :-) Se si ha a che fare con un sacco di testo o lunghe righe, potrebbe essere molto più veloce della divisione o dell'uso di 'lines'. Ti consiglio di aggiungere alcuni benchmark alla tua risposta per mostrare il vantaggio. –

+1

@the Tin Man Benchmaked contro 'lines' e non trovi alcuna differenza, non importa quale sia la dimensione della stringa. Risulta che 'lines' non restituisce un array ma un enumeratore (molto meglio!). Quindi ora penso che la risposta di @Dictor Derryagin sia la migliore. – steenslag

+2

Non sarà più veloce di 'lines', perché, come hai trovato,' lines' è un enumeratore. Sarà molto più veloce di qualsiasi soluzione, come 'split', che crea un array, specialmente quando l'array risultante è grande. –

0

Un'alternativa alla risposta di @ steenslag sarebbe quella di utilizzare StringIO per ottenere solo la prima riga.

str = <<DOC1 
asrg 
aeg 
aegfr 
DOC1 

puts StringIO.open(str, &:readline) 

se la stringa è enorme, questo evita la scissione la stringa in una matrice di grandi dimensioni e legge solo la prima riga. Nota, genera un EOFError se la stringa è vuota.

Problemi correlati