使用Ruby从文件中的一行中提取第一个单词

时间:2015-01-16 05:03:42

标签: ruby string

如何从每一行获得第一个单词?感谢Stack Overflow上的人的帮助,我正在使用以下代码:

File.open("pastie.rb", "r") do |file|
  while (line = file.gets)
    next if (line[0,1] == " ")
    labwords = line.split.first
    print labwords.join(' ')
  end
end

它从每一行中提取第一个单词,但它有空格问题。我需要帮助调整它。我需要使用first方法,但我不知道如何使用它。

2 个答案:

答案 0 :(得分:3)

如果您想要文件中每行的第一个单词:

first_words = File.read(file_name).lines.map { |l| l.split(/\s+/).first }

非常简单。让我们分开吧:

File.read(file_name)

读取文件的全部内容并将其作为字符串返回。

.lines

按换行符(\n)拆分字符串并返回字符串数组。每个字符串代表一条"行。"

.map { |l| ... }

Array#map调用提供的块传递每个项目并获取块的返回值以构建新数组。 Array#map完成后,它将返回包含新值的数组。这允许您转换值。在此处的示例块中,|l|是块参数部分,这意味着我们正在接受一个参数,我们将其引用为l

|l| l.split(/\s+/).first

这是内部阻滞,我已经完成了包括块参数在内的完整性。在这里,我们将行分为/\s+/。这是一个正则表达式,\s表示任何空格\t \n和空格),+表示一个或多个所以\s+表示一个或多个空白字符,当然,它会尝试匹配尽可能多的连续空白字符。将此传递给String#split将返回一个子串的数组,这些子串出现在之间给出的分隔符​​。现在,我们的分隔符是一个或多个空格所以我们应该在空格之间获取所有内容。如果我们有字符串"A list of words",我们将在分割调用后获得["A", "list", "of", "words"]。它非常有用。最后,我们调用.first返回数组的第一个元素(在本例中为#34;第一个单词")。

现在,在Ruby中,自动返回块中最后一个表达式的求值,因此返回第一个单词,并且假定该块传递给map,我们应该从文件中获取第一个单词的数组。为了演示,让我们接受输入(假设我们的文件包含):

This is line one
And line two here
Don't forget about line three
Line four is very board
Line five is the best
It all ends with line six

通过上面的行运行,我们得到:

["This", "And", "Don't", "Line", "Line", "It"]

每行的第一个单词。

答案 1 :(得分:1)

考虑一下:

def first_words_from_file(file_name)
  lines = File.readlines(file_name).reject(&:empty?)
  lines.map do |line|
    line.split.first
  end
end

puts first_words_from_file('pastie.rb')