0

我想扫描一个流并只检索那些包含关键字的行,这就是我到目前为止所得到的......

ERROR_WORDS = ['Error','Invalid','Out of Range']

error_stream = stderr.read
errors = nil
unless error_stream.nil?
   errors = ERROR_WORDS.detect{ |e| error_stream.include? e }

假设error_stream包含这个...

4/19/12 - 9:00am: Last check, status ok
4/19/12 - 9:15am: File # 456 received contained Error
4/19/12 - 9:30am: Last check, status ok
4/19/12 - 9:45am: File # 457 is has an Invalid timestamp

...我想扫描流并errors仅返回具有 in 中的任何关键字的那些行(完整)ERROR_WORDS,因此,在这种情况下,只有第 2 行和第 4 行包含错误词

我需要errors,再想一想,它可能需要是一个数组,才能拥有......

4/19/12 - 9:15am: File # 456 received contained Error
4/19/12 - 9:45am: File # 457 is has an Invalid timestamp

我的代码返回这个...

Error
Invalid
4

1 回答 1

1

如果您首先将输入读取为行而不是一个大字符串,则会更容易。

你有几个不同的选择来做测试。您可以每次循环遍历 ERR​​OR_WORDS 数组,但构建正则表达式可能会更有效:

ERROR_REGEXP = Regexp.new(ERROR_WORDS.join '|')

然后您的代码如下所示:

error_lines = stderr.readlines
errors = error_lines.find_all { |line| line =~ ERROR_REGEXP }

如果您仍然需要将整个错误流作为一个大字符串,您可以构建它:

error_stream = error_lines.join "\n"

另一方面,如果你只需要匹配的行,你可以一次完成整个事情:

errors = stderr.readlines.find_all { |line| line =~ ERROR_REGEXP }
于 2012-04-19T19:48:19.850 回答