为什么不能在ruby中的数组上使用Match方法?

时间:2019-10-21 00:15:10

标签: arrays regex ruby parsing iterator

我需要迭代并解析文件中的108行,然后将它们分类为3个不同的哈希值。 (在一个迭代器中。)(在Ruby中)

我已将文件加载到程序以及需要解析的数组中。无论如何,当我尝试使用迭代器时,我尝试使用Regex Match命令,但遇到未知方法却出错。不能在数组上使用该方法很简单?

lines = File.readlines('access_log')

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

这以及我尝试使用不起作用的match方法的所有其他方式。 对于哈希也没有任何作用,因为我还没有这样做。

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

也尝试过此方法,但是错误输出显示您不能仅在阵列上运行它。我相信这是我需要绑定迭代器的地方,但是我很困惑。

1 个答案:

答案 0 :(得分:3)

所以,发生的事情是readlines会吞噬整个文本文件。

因此,您有一个数组,文本文件的内容用换行符分隔(换行符保留在数组的每个字符串中)。

此后,您正在执行lines.each,这将带来一个枚举器。然后您在枚举器上调用.match而不是字符串本身

正确的方法是

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

但是,上面的操作实际上不会做任何事情,因为您所做的只是对每个元素进行迭代并检查它是否与REGEX相匹配。如果您希望它实际执行某项操作,请尝试...

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

请记住,match方法仅适用于字符串。如果match匹配某项,则返回MatchData类的对象,否则返回null。