我需要迭代并解析一个文件中的108行,然后将它们排序为3个不同的散列(在一个迭代器中。)(在Ruby中)
我将文件加载到程序和需要解析的数组中。当我试图使迭代器无论如何,我尝试使用regex match命令,我得到一个关于未知方法的错误。很简单,我不能在数组中使用那个方法吗?

lines = File.readlines('access_log')

lines.each.match(/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/)

这和其他的方法我都试过用匹配的方法,但都没用。
这对杂凑也没什么好处,因为我还没做过。
/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/.match(lines)

也尝试过此操作,但错误输出显示您无法仅在数组上运行它我住在这里,我需要把迭代器绑定到这里,但是我被难住了。

最佳答案

所以,所发生的是readlines所做的是它对整个文本文件进行slurps。
因此,您有一个数组,文本文件的内容由换行符分隔(换行符保留在数组中的每个字符串中)。
在那之后,你要做的是lines.each,这会产生一个枚举器然后调用.匹配枚举数而不是字符串本身
正确的方法是

lines.each { |line| line.match(/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/) }

但是,上面的操作实际上不会做任何事情,因为您所做的只是对每个元素进行迭代并检查它是否与regex匹配。
  matches = lines.map { |line| line.match(/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/) }

记住match方法只对字符串有效。如果match匹配某个对象,则返回MatchData类的一个对象,如果它不匹配任何对象,则返回-nil。

09-10 01:22
查看更多