我正试图找到解决这个问题的方法:
实现一个简单的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.
我可以显示该文件,但无法将其与正则表达式进行比较。当我尝试比较它时,它已经打印出错误。有人可以在我的代码中指出错误并帮助我找到问题的解决方案吗?
答案 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')
应该有效