2011-11-18 18 views
13

mam zmienną string w Ruby następująco:Jak uzyskać pierwszą linię z ciągu w Ruby?

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

wyjście powyższego kodu jest:

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

Muszę tylko pierwszą linię od zmiennej tekstowej (np my::FIrst::Line) . Jak mogę to zdobyć?

Odpowiedz

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

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

Na marginesie unikaj używania zmiennych globalnych (oznaczenie $).

+0

Przydało się to w przypadku projektu w wersji 1.8.6 (który nie obsługuje #linii) – Mikey

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

dzieli łańcuch na '\ n' tokenów i dostać pierwszy jeden

28
$varString.lines.first 

Albo, jeśli chcesz pozbyć końcowego znaku nowej linii w wynikającej wyrażenie:

$varString.lines.first.chomp 
+4

+1 za użycie '# lines' –

4
str = <<DOC1 
asrg 
aeg 
aegfr 
DOC1 

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

Pozwala uniknąć czytania całego ciągu znaków w tablicy. (The || -1 unika błędu, jeśli nie ma końca linii w ciągu). EDYCJA str.lines nie tworzy tablicy.

+0

+1, ponieważ powinno być szybsze, chociaż jest nieco więcej .. ośmielę się powiedzieć ... Perl-owski, ponieważ zwiększa hałas linii. :-) Jeśli mamy do czynienia z dużą ilością tekstu lub długich linii, może to być DUŻO szybsze niż podział lub użycie 'linii'. Zalecam dodanie do wyników niektórych benchmarków, aby pokazać korzyści. –

+1

@ Tin Man Benchmaked it against 'lines' i coud znaleźć żadnej różnicy, bez względu na rozmiar tej struny. Okazuje się, że 'lines' nie zwraca tablicy, ale moduł wyliczający (o wiele lepszy!). Więc teraz myślę, że odpowiedź @Victora Deryagina jest najlepsza. – steenslag

+2

Nie będzie szybszy niż 'lines', ponieważ, jak zauważyłeś,' lines' jest modułem wyliczającym. Będzie to dużo szybsze niż jakiekolwiek rozwiązanie, takie jak 'split', które tworzy tablicę, szczególnie gdy wynikowa tablica jest duża. –

0

Alternatywą dla odpowiedzi @ steenslag byłoby użycie StringIO, aby uzyskać tylko pierwszą linię.

str = <<DOC1 
asrg 
aeg 
aegfr 
DOC1 

puts StringIO.open(str, &:readline) 

Jeśli łańcuch jest duży, unika się podziału struny na dużą tablicę i odczytuje tylko pierwszą linię. Zauważ, że zgłasza EOFError, jeśli ciąg znaków jest pusty.

Powiązane problemy