任何人都可以解释我如何在Ruby中使用正则表达式只返回字符串的匹配项.
例如,如果代码读入包含一系列名称的.txt文件:
John Smith
James Jones
David Brown
Tom Davidson
etc etc
Run Code Online (Sandbox Code Playgroud)
..并且匹配的单词输入为'ohn',然后它将返回'John Smith',但没有其他名称.
the*_*Man 24
这里有一些不同的方法可以让你到达目的地.
首先请注意,我正在使用更惯用的方式编写用于从文件中读取行的代码.Ruby的IO和文件库使得在一个漂亮整洁的包中打开,读取和关闭文件变得非常容易.
[1] pry(main)> IO.foreach('./.bashrc') do |l|
[1] pry(main)* puts l
[1] pry(main)* end
export PATH=~/bin:$PATH
export EDITOR='vi'
export VISUAL=$EDITOR
Run Code Online (Sandbox Code Playgroud)
这在行中的任何地方寻找'ohn',但不会打扰正则表达式.
File.each_line('file.txt') do |li|
puts li if (li['ohn'])
end
Run Code Online (Sandbox Code Playgroud)
这会查找相同的字符串,只有它使用正则表达式才能到达那里.在功能上它与第一个例子相同.
File.each_line('file.txt') do |li|
puts li if (li[/ohn/])
end
Run Code Online (Sandbox Code Playgroud)
这是寻找以'ohn'结尾的名字的一种更聪明的方式.它使用正则表达式,但也指定模式必须出现在单词的末尾.File.each_line意为"字边界".
此外,在阅读文件时,始终要考虑正在阅读的文件是否可能超过应用程序可用的RAM,这一点很重要.一次性将整个文件读入内存很容易,然后从RAM处理,但如果超出可用的物理RAM,则可能会削弱或终止您的应用程序或计算机.
你知道其他答案所显示的代码是否实际上是将整个文件加载到RAM中,或者是否通过从readlines函数流式传输到select函数进行优化?
从IO#readlines文档:
将由name指定的整个文件读取为单独的行,并在数组中返回这些行.行由sep分隔.
另一个考虑因素是大量批量读取期间的内存分配.即使你有足够的RAM,你也可以遇到语言在读入数据时窒息的情况,发现它没有为变量分配足够的内存,并且在抓取更多内容时必须暂停.该循环重复,直到加载整个文件.
多年前,当我将一个非常大的数据文件加载到HP最大的迷你应用程序的Perl应用程序中时,我变得非常敏感.该应用程序会定期暂停几秒钟,我无法弄清楚原因.我进入了调试器,无法找到问题.最后,通过使用旧式打印语句跟踪运行,我将暂停分离为文件"slurp".我有足够的内存和足够的处理能力,但Perl没有分配足够的内存.我逐渐切换到阅读,应用程序飞过它的处理.像Perl一样,Ruby具有良好的I/O,并且在逐行读取时可以非常快速地读取大文件.我从来没有找到一个很好的理由来诋毁文本文件,除非我可以将内容分布在多行中,但这种情况并不常见.
jxp*_*777 16
也许我不完全理解这个问题,但你可以这样做:
File.readlines("path/to/file.txt").select { |line| line =~ /ohn/ }
Run Code Online (Sandbox Code Playgroud)
获取符合条件的所有行的数组.
Dou*_*rer 11
query = 'ohn'
names = File.readlines('names.txt')
matches = names.select { |name| name[/#{query}/i] }
#=> ["John Smith"]
Run Code Online (Sandbox Code Playgroud)
i如果您希望查询区分大小写,请删除正则表达式的末尾.