下午好!
我是Ruby的新手,想要在Ruby中编写基本搜索和替换函数。 当您调用该函数时,您可以传递参数(搜索模式,替换单词)。
这样的工作原理如下:multiedit(pattern1,replacement1,pattern2,replacement2,...)
现在,我希望我的函数读取文本文件,搜索pattern1并将其替换为replacement2,搜索pattern2并将其替换为replacement2,依此类推。最后,更改的文本应写入另一个文本文件。
我尝试使用until循环执行此操作,但我得到的只是第一个模式被替换而所有以下模式都被忽略(在此示例中,只有apple替换为fruit)。我认为问题在于我总是重读未经修改的原始文本?但我无法找到解决方案。你能帮助我吗?以我的方式调用函数对我来说非常重要。
def multiedit(*_patterns)
return puts "Number of search patterns does not match number of replacement strings!" if (_patterns.length % 2 > 0)
f = File.open("1.txt", "r")
g = File.open("2.txt", "w")
i = 0
until i >= _patterns.length do
f.each_line {|line|
output = line.sub(_patterns[i], _patterns[i+1])
g.puts output
}
i+=2
end
f.close
g.close
end
multiedit("apple", "fruit", "tomato", "veggie", "steak", "meat")
你可以帮帮我吗?
非常感谢你!
此致
答案 0 :(得分:5)
你的循环是内而外的......反过来......
f.each_line do |line|
_patterns.each_slice 2 do |a, b|
line.sub! a, b
end
g.puts line
end
答案 1 :(得分:3)
评估每一行的所有模式的最有效方法可能是从所有搜索模式构建单个正则表达式并使用String#gsub的哈希替换形式
def multiedit *patterns
raise ArgumentError, "Number of search patterns does not match number of replacement strings!" if (_patterns.length % 2 != 0)
replacements = Hash[ *patterns ].
regexp = Regexp.new replacements.keys.map {|k| Regexp.quote(k) }.join('|')
File.open("2.txt", "w") do |out|
IO.foreach("1.txt") do |line|
out.puts line.gsub regexp, replacements
end
end
end
答案 2 :(得分:0)
更简单,更好的方法是使用erb。