2011-11-18 98 views
13

我有红宝石的字符串变量,如下所示:如何从Ruby的字符串中获得第一行?

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

上述代码的输出为:

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

我需要得到只从字符串变量的第一行(例如my::FIrst::Line) 。 我怎样才能得到它?

回答

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

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

作为一个附注,避免使用全局($符号)变量。

+0

这对于1.8.6(不支持#lines)的项目很有用 – Mikey

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

拆分上 '\ n' 令牌字符串,并获得第一个

28
$varString.lines.first 

或者,如果你想在结果字符串摆脱最终的换行符:

$varString.lines.first.chomp 
+4

对于#行的使用+1, –

4
str = <<DOC1 
asrg 
aeg 
aegfr 
DOC1 

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

避免读取数组中的整个字符串。 (如果没有以字符串结尾的行,则|| -1会避免错误)。 编辑 str.lines不会创建数组。

+0

+1因为这应该会更快,尽管它有点多..我敢说它...... Perl-ish,因为它增加了线路噪声。 :-)如果处理大量文本或长行,它可能比分割或使用“行”更快。我建议在回答中添加一些基准以显示其好处。 –

+1

@ The Tin Man将它与“线条”对齐,不管字符串的大小如何,coud都没有区别。事实证明,'lines'不会返回一个数组,而是一个枚举器(好得多!)。所以现在我认为@Victor Deryagin的回答是最好的。 – steenslag

+2

它不会比'lines'快,因为如你所见,'lines'是一个枚举器。它比任何解决方案快很多,比如'split',它会创建一个数组,尤其是当结果数组很大时。 –

0

@ steenslag的答案的替代方法是使用StringIO来获取第一行。

str = <<DOC1 
asrg 
aeg 
aegfr 
DOC1 

puts StringIO.open(str, &:readline) 

如果字符串很大,这样可以避免将字符串拆分为大数组并只读取第一行。请注意,如果字符串为空,则会引发EOFError。

相关问题