获取与rails中的regex匹配的行

时间:2014-01-21 20:24:00

标签: ruby-on-rails regex

我有一长串存储在变量中的信息,我需要针对该变量运行一些正则表达式,并从找到的内容中获取各种信息。

  1. 如何在变量中存储与正则表达式匹配的行?
  2. 如何获得与正则表达式匹配的行的行号?
  3. 这是我正在谈论的一个例子。

    body =“service timestamps log datetime msec localtime show-timezone 服务密码加密 ! 主机名switch01 ! 引导启动-标记“

    如果我搜索包含“hostname”的行,我需要行号,在这种情况下它将是4.我还需要将“hostname switch01”行存储为另一个变量。

    有什么想法吗?

    谢谢!

2 个答案:

答案 0 :(得分:0)

首先,您需要将字符串转换为行:body.split('\n'),然后您想要在行中添加行号:.each_with_index。然后,您要选择行.select {|line, line_nr| line =~ your_regex }。把它们放在一起:

body.split('\n').each_with_index
                .select {|line, line_nr| line =~ your_regex }
                .map {|line, line_nr| line_nr }

这将为您提供与'your_regex'

匹配的所有行

答案 1 :(得分:0)

假设您有一个提供file方法的对象#lines

lines = file.lines.each_with_index.select {|line, i| line =~ /regex/ }

如果您已经有一个行列表,则可以忽略对#lines的呼叫。如果您有字符串,则可以使用string.split("\n") 这将导致变量lines包含一个2元素数组的数组,其中的行与您的RegEx和原始文件中的行的索引相匹配。

击穿

file.lines得到了界限 - 当然我提到的其他方法也适用于你。然后我们使用#each_with_index为每个元素添加索引,因为您也想存储它们。这与#map.with_index {|e, i| [e, i]}具有相同的效果,即将每个元素映射到[element, index]。然后,我们使用#select方法获取与您的RegEx匹配的所有行(FYI,=~是Ruby,Perl和其他语言中的匹配运算符 - 如果您还不知道的话)。我们之后就完成了,但您可能需要进一步转换数据,以便处理它。