我认为
desired_portion_lines = ""
text.each_line do |line|
desired_portion_lines << line if line =~ /start_regex/ .. line =~ /finish_regex/
end
完全可以接受。操作符很强大,..
但是没有被很多人使用,可能是因为他们不明白它的作用。可能它对你来说看起来很奇怪或尴尬,因为你不习惯使用它,但它会在你身上生长。在处理文本文件中的行范围时,它在 Perl 中很常见,这是我第一次遇到它,并且最终被大量使用。
我唯一不同的是添加一些括号以在视觉上将逻辑测试彼此分开,并与该行的其余部分分开:
desired_portion_lines = ""
text.each_line do |line|
desired_portion_lines << line if ( (line =~ /start_regex/) .. (line =~ /finish_regex/) )
end
Ruby(和 Perl)编码人员似乎讨厌使用括号,但我认为它们对于在视觉上分离逻辑测试很有用。对我来说,这是一个可读性,并且,通过扩展,一个维护的东西。
我能想到的唯一另一件事可能会有所帮助,那就是更改desired_portion_lines
为一个数组,然后将您选择的行推到它上面。目前,使用desired_portion_lines << line
附加到字符串,每次都会改变它。推动数组然后加入其元素以构建您的字符串可能会更快。
回到第一个例子。我没有对此进行测试,但我认为您可以将其简化为:
desired_portion = text.each_line.find_all { |line| line =~ /start_regex/ .. line =~ /finish_regex/ }.join
使用触发器遍历文件中所有行的唯一缺点是,如果启动模式可以多次出现,您将获得每个找到的块添加到desired_portion
.