Ruby检查字符串是否包含子串

时间:2016-09-28 07:46:46

标签: ruby

我有很多日志文件,每个文件都包含这样一行:

THIS LINE IS DIFFERENT CASE_WINDOWS_TEST_00 PASSED

我正在搜索行是否包含" _XXX_TEST _"串。我创建了一个哈希:

@@groups = {
    "_LINUX_TEST_" => "Linux_tests",
    "_WINDOWS_TEST_" => "Windows_tests"
}

要检查该行是否包含子字符串(来自@@ groups的密钥),我实现了方法get_group_name,它返回@@ groups的值。

def get_group_name(searchLine)
    @@groups.keys.each do |i| 
        if searchLine.include? i
            return @@groups[i]
        end
    end
end

工作正常,返回正确的值。我在另一个遍历日志文件的方法中使用此方法。

def get_group_name_from_file(fileName)
    # fileName - filename or path to the file.txt
    file = File.open(fileName)
    while (line = file.gets)
        found = get_group_name(line)
        if found 
            return found
        end
    end
end

这就是问题所在。方法get_group_name_from_file返回@@ groups散列中的键列表而不是一个字符串(该散列中的值)。

2 个答案:

答案 0 :(得分:1)

我认为,当您的日志文件没有包含任何@@ groups.keys的行时,可能会出现此问题,因此,为了解决此问题,您可以添加以下行:

@@groups = {
    "_LINUX_TEST_" => "Linux_tests",
    "_WINDOWS_TEST_" => "Windows_tests"
  }

  def get_group_name(searchLine)
    @@groups[@@groups.keys.find { |key| searchLine.include? key }]
  end

  def get_group_name_from_file(fileName)
    # fileName - filename or path to the file.txt
    file = File.open(fileName)
    while (line = file.gets)
      found = get_group_name(line)
      return found if found
    end
  end

答案 1 :(得分:1)

当它返回每个方法返回的输出时,如果控件未达到最高值,则会发生这种情况:

return @group[i];

您可以将方法更新为:

def get_group_name(searchLine)
  @@groups.keys.each do |i| 
    if searchLine.include? i
      return @@groups[i]
    end
  end
  return nil
end

还有一个选择:

def get_group_name(searchLine)
  @groups.keys.detect do |i|
    if searchLine.include? i
      return @groups[i]
    end
  end
end