在与正则表达式匹配的文本文件中查找行

任何人都可以解释我如何在Ruby中使用正则表达式只返回字符串的匹配项。

例如,如果代码读入包含一系列名称的.txt文件:

John Smith James Jones David Brown Tom Davidson etc etc 

..并且匹配的单词输入为’ohn’,然后它将返回’John Smith’,但没有其他名称。

以下是一些不同的方式来到达目的地。

首先请注意,我正在使用更惯用的方式编写用于从文件中读取行的代码。 Ruby的IO和文件库使得在一个漂亮整洁的包中打开,读取和关闭文件变得非常容易。

 File.each_line('file.txt') do |li| puts li if (li['ohn']) end 

这在行中的任何地方寻找’ohn’,但不会打扰正则表达式。

 File.each_line('file.txt') do |li| puts li if (li[/ohn/]) end 

这会查找相同的字符串,只有它使用正则表达式才能到达那里。 在function上它与第一个例子相同。

 File.each_line('file.txt') do |li| puts li if (li[/ohn\b/]) end 

这是寻找以’ohn’结尾的名字的一种更聪明的方式。 它使用正则表达式,但也指定模式必须出现在单词的末尾。 \b表示“字边界”。

此外,在阅读文件时,始终要考虑正在阅读的文件是否可能超过应用程序可用的RAM,这一点很重要。 一次性将整个文件读入内存很容易,然后从RAM处理它,但如果超出可用的物理RAM,则可能会削弱或终止您的应用程序或计算机。


你知道其他答案所显示的代码是否实际上是将整个文件加载到RAM中,还是通过从readlines函数流向select函数进行优化?

从IO#readlines文档:

将由name指定的整个文件读取为单独的行,并在数组中返回这些行。 线由sep分隔。

另一个考虑因素是大量批量读取期间的内存分配。 即使你有足够的RAM,你也可以遇到语言在读入数据时发生窒息的情况,发现它没有为变量分配足够的内存,并且在抓取更多内容时必须暂停。 该循环重复,直到加载整个文件。

多年前,当我将一个非常大的数据文件加载到HP最大的迷你应用程序的Perl应用程序中时,我变得非常敏感。 该应用程序会定期暂停几秒钟,我无法弄清楚原因。 我进入了调试器,无法找到问题。 最后,通过使用旧式打印语句跟踪运行,我将暂停分离为文件“slurp”。 我有足够的内存和足够的处理能力,但Perl没有分配足够的内存。 我逐渐切换到阅读,应用程序飞过它的处理。 像Perl一样,Ruby具有良好的I / O,并且可以在逐行读取时快速读取大文件。 我从来没有找到一个很好的理由来诋毁文本文件,除非可能有我想要的内容分布在几行,但这不常见。

也许我没有完全理解这个问题,但你可以这样做:

 File.readlines("path/to/file.txt").select { |line| line =~ /ohn/ } 

获取符合条件的所有行的数组。

 query = 'ohn' names = File.readlines('names.txt') matches = names.select { |name| name[/#{query}/i] } #=> ["John Smith"] 

如果您希望查询区分大小写,请删除正则表达式末尾的i

旧问题,但Array#grep也可用于搜索字符串列表

 File.readlines("names.txt").grep /#{query}/i