如何从Ruby中的String获取第一行?

时间:2011-11-18 10:44:40

标签: ruby

我在Ruby中有一个字符串变量,如下所示:

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

上面代码的输出是:

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

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

7 个答案:

答案 0 :(得分:34)

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

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

作为旁注,请避免使用全局($符号)变量。

答案 1 :(得分:28)

$varString.lines.first

或者,如果你想在结果字符串中删除最后的换行符:

$varString.lines.first.chomp

答案 2 :(得分:4)

str = <<DOC1
asrg
aeg
aegfr
DOC1

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

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

答案 3 :(得分:1)

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

将字符串拆分为'\ n'标记,然后获取第一个

答案 4 :(得分:1)

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

str = <<DOC1
asrg
aeg
aegfr
DOC1

puts StringIO.open(str, &:readline)

如果字符串很大,这可以避免将字符串拆分为大型数组并仅读取第一行。注意,如果字符串为空,它会抛出一个EOFError。

答案 5 :(得分:0)

first_line = str[/.*/]

就内存分配和性能而言,此解决方案似乎是最有效的解决方案。

这使用str[regexp]格式,请参见https://ruby-doc.org/core-2.6.5/String.html#method-i-5B-5D

基准代码:

require 'benchmark/ips'
require 'benchmark/memory'

str = "test\n" * 100

Benchmark.ips do |x|
  x.report('regex') { str[/.*/] }
  x.report('index') { str[0..(str.index("\n") || -1)] }
  x.report('stringio') { StringIO.open(str, &:readline) }
  x.report('each_line') { str.each_line.first.chomp }
  x.report('lines') { str.lines.first }
  x.report('split') { str.split("\n").first }
  x.compare!
end

Benchmark.memory do |x|
  x.report('regex') { str[/.*/] }
  x.report('index') { str[0..(str.index("\n") || -1)] }
  x.report('stringio') { StringIO.open(str, &:readline) }
  x.report('each_line') { str.each_line.first.chomp }
  x.report('lines') { str.lines.first }
  x.report('split') { str.split("\n").first }
  x.compare!
end

基准测试结果

Comparison:
               regex:  5099725.8 i/s
               index:  4968096.7 i/s - 1.03x  slower
            stringio:  3001260.8 i/s - 1.70x  slower
           each_line:  2330869.5 i/s - 2.19x  slower
               lines:   187918.5 i/s - 27.14x  slower
               split:   182865.6 i/s - 27.89x  slower

Comparison:
               regex:         40 allocated
               index:        120 allocated - 3.00x more
            stringio:        120 allocated - 3.00x more
           each_line:        208 allocated - 5.20x more
               lines:       5064 allocated - 126.60x more
               split:       5104 allocated - 127.60x more

答案 6 :(得分:0)

您也可以使用截断方法。

  iam_instance_profile {
    name = aws_iam_instance_profile.rig_stopgap.arn
  }
'Once upon a time in a world far far away'.truncate(27, separator: ' ')
# => "Once upon a time in a..."

为了不中间切单词,当您选择的字符数之后有一个空格时,它将结束。

API doc