ruby - 比较数组是否匹配字符串

标签 ruby arrays string compare telnet

我有一个脚本,可以远程登录到一个盒子,运行命令并保存输出。之后我运行另一个脚本,该脚本解析输出文件,将其与另一个文件中的关键字进行比较以进行匹配。如果一行匹配,它应该将整行(来自原始 telnet 输出)保存到新文件中。

以下是处理解析文本的脚本部分:

def parse_file
    filter = []
    temp_file = File.open('C:\Ruby193\scripts\PARSED_TRIAL.txt', 'a+')
    t = File.open('C:\Ruby193\scripts\TRIAL_output_log.txt')
    filter = File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines
    t.each do |line|
        filter.each do |segment|
            if (line =~ /#{segment}/)
                temp_file.puts line
            end
        end
    end
    t.close()
    temp_file.close()
end

目前,它仅保存位于数组 filter 中的最后一次运行的字符串,并将其保存到 temp_file 中。看起来循环没有运行数组中的所有字符串,或者没有保存所有字符串。我在文本文件 Filtered_text.txt 中放置了五个字符串。它只将我的最后一个匹配行打印到 temp_file 中。

最佳答案

此(未经测试的代码)将复制原始代码,只是更加简洁和惯用:

filter = Regexp.union(File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines.map(&:chomp))
File.open('C:\Ruby193\scripts\PARSED_TRIAL.txt', 'a+') do |temp_file|
  File.foreach('C:\Ruby193\scripts\TRIAL_output_log.txt') do |l|
    temp_file.puts l if (l[filter])
  end
end

让您了解正在发生的事情:

Regexp.union(%w[a b c])
=> /a|b|c/

这为您提供了一个正则表达式,它将遍历字符串以查找任何子字符串匹配。这是区分大小写的搜索。

如果您想堵住这些漏洞,请使用以下内容:

Regexp.new(
  '\b' + Regexp.union(
    File.open('C:\Ruby193\scripts\Filtered_text.txt').readlines.map(&:chomp)
  ).source + '\b',
  Regexp::IGNORECASE
)

使用与上面相同的示例输入数组将导致:

/\ba|b|c\b/i

关于ruby - 比较数组是否匹配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13018048/

相关文章:

ruby - 如何拆分包含多个正斜杠的字符串

ruby - 在 Fixnum 的实例上定义方法

C++ 指针数组

javascript - myString.replace( VARIABLE, "") ...... 但在全局范围内

正则表达式从 R 中的字符串中删除所有非数字符号

ruby - 如何更新ubuntu中的gem命令?

PHP - MYSQL 从数组中查询多个值

javascript - 多维数组的 indexOf 语法?

java - 有没有一种快速识别 String 或 TextView 中的 HTML ASCII 代码的方法?

ruby - 使用watir-webdriver,是否可以使用元素的一部分来测试