Ruby:如何使用正则表达式解决一个简单的grep函数?

时间:2017-06-09 00:02:11

标签: ruby

我正试图找到解决这个问题的方法:

  

实现一个简单的grep函数,该函数将字符串x作为输入,并在一行中的任何位置打印出任何字符串x出现的文件的行。从文件中读取行后,需要进行简单的正则表达式匹配。输出还应包括行号。

以下是我编写的代码示例。注意:我还没有创建一个函数,我首先需要获取代码来识别文件并显示相应的消息。

x=/you/

aFile = File.open("filename1.txt", "r") 

a = "" 

aFile.each {|line|
    a << line
}

sentence = a.split(".")

puts sentence

if sentence=~x
    puts "yes"
else
    puts "no"
end


aFile.close

这是filename1.txt的内容:

See you tomorrow. Have a good day Mr. Jones. See you tomorrow. Have a good 
day. See you tomorrow. See you tomorrow.

我可以显示该文件,但无法将其与正则表达式进行比较。当我尝试比较它时,它已经打印出错误。有人可以在我的代码中指出错误并帮助我找到问题的解决方案吗?

2 个答案:

答案 0 :(得分:1)

结果是意外的,因为sentence是一个数组。我不确定你可能会得到什么错误,但我得到的结果是一个'不'的反应。要查看每个单独句子的结果,您需要使用循环:

sentence.each do |s|
  puts s
  if s =~ x
    puts "yes"
  else
    puts "no"
  end
end

产生以下结果:

See you tomorrow
yes
 Have a good day Mr
no
 Jones
no
 See you tomorrow
yes
 Have a good 
day
no
 See you tomorrow
yes
 See you tomorrow
yes

no

最终结果发生是因为split在数组中为分隔符的两边插入了一个元素。最后一句后面没有任何内容,因此split方法会向数组中添加一个空字符串。

请注意,使用句号用于缩写(“琼斯先生”)时,使用句点提取句子也存在问题。对于以问题或感叹号结尾的句子,它也不起作用。最后,省略号将使用此技术添加 4个句子

答案 1 :(得分:0)

您可以编写这样的方法并传递单词和文件名。注意:您必须适当地处理异常。该方法将返回包含单词的内容的实际行号。

  def search_word_in_file(word, file_name)
    regex = Regexp.new(word, "gi") # you may get rid of gi if you want exact match
    lines_with_number = {}
    f = File.open(file_name, 'r')
    f.each_line.with_index do |line, index|
      actual_line_number = index + 1
      if (regex).match(line)
        lines_with_number[actual_line_number] ||= []
        lines_with_number[actual_line_number] << line
      end
    end
    f.close
    lines_with_number
  end

所以,

search_word_in_file('you', 'filename1.txt')

应该有效