使用 Ruby 从文件中的一行中提取第一个单词
Extract first word from a line in a file using Ruby
如何从每行中获取第一个词?感谢 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
方法,但是不知道怎么用
如果您想要文件中每一行的第一个单词:
first_words = File.read(file_name).lines.map { |l| l.split(/\s+/).first }
这很简单。让我们把它分开:
File.read(file_name)
读取文件的全部内容并将其return作为字符串。
.lines
按换行符 (\n
) 和 return 字符串数组拆分字符串。每个字符串代表一个"line."
.map { |l| ... }
Array#map
调用提供的块,传入每个项目并采用块的 return 值来构建一个新数组。一旦 Array#map
完成它 returns 包含新值的数组。这允许您转换值。在此处的示例块中,|l|
是块参数部分,这意味着我们采用一个参数,我们将其引用为 l
.
|l| l.split(/\s+/).first
这是块内部,为了完整性,我已经继续并在此处包含了块参数。这里我们用 /\s+/
分割线。这是一个正则表达式,\s
表示任何白色space(\t \n
和space)和+
跟随它意味着一个或多个所以\s+
意味着一个或多个白色space字符当然,它会尝试匹配尽可能多的连续白色 space 字符。将此传递给 String#split
将 return 出现在给定分隔符 之间 的子字符串数组。现在,我们的分隔符是 一个或多个白色 space 所以我们应该得到白色 space 之间的所有内容。如果我们有字符串 "A list of words"
,我们将在拆分调用后得到 ["A", "list", "of", "words"]
。这非常有用。最后,我们调用 .first
,其中 return 是数组的第一个元素(在本例中为 "the first word")。
现在,在 Ruby 中,块中最后一个表达式的计算值会自动 returned,所以我们的第一个词是 returned 并且假设这个块已通过要映射,我们应该从文件中获取第一个单词的数组。为了演示,让我们输入(假设我们的文件包含):
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"]
每行的第一个词。
考虑一下:
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')
如何从每行中获取第一个词?感谢 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
方法,但是不知道怎么用
如果您想要文件中每一行的第一个单词:
first_words = File.read(file_name).lines.map { |l| l.split(/\s+/).first }
这很简单。让我们把它分开:
File.read(file_name)
读取文件的全部内容并将其return作为字符串。
.lines
按换行符 (\n
) 和 return 字符串数组拆分字符串。每个字符串代表一个"line."
.map { |l| ... }
Array#map
调用提供的块,传入每个项目并采用块的 return 值来构建一个新数组。一旦 Array#map
完成它 returns 包含新值的数组。这允许您转换值。在此处的示例块中,|l|
是块参数部分,这意味着我们采用一个参数,我们将其引用为 l
.
|l| l.split(/\s+/).first
这是块内部,为了完整性,我已经继续并在此处包含了块参数。这里我们用 /\s+/
分割线。这是一个正则表达式,\s
表示任何白色space(\t \n
和space)和+
跟随它意味着一个或多个所以\s+
意味着一个或多个白色space字符当然,它会尝试匹配尽可能多的连续白色 space 字符。将此传递给 String#split
将 return 出现在给定分隔符 之间 的子字符串数组。现在,我们的分隔符是 一个或多个白色 space 所以我们应该得到白色 space 之间的所有内容。如果我们有字符串 "A list of words"
,我们将在拆分调用后得到 ["A", "list", "of", "words"]
。这非常有用。最后,我们调用 .first
,其中 return 是数组的第一个元素(在本例中为 "the first word")。
现在,在 Ruby 中,块中最后一个表达式的计算值会自动 returned,所以我们的第一个词是 returned 并且假设这个块已通过要映射,我们应该从文件中获取第一个单词的数组。为了演示,让我们输入(假设我们的文件包含):
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"]
每行的第一个词。
考虑一下:
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')