2

我正在逐行浏览一个文件,我想检查该行是否包含数组中的任何元素。例如,如果我有:

myArray = ["cat", "dog", "fish"]

当前行说:

我爱我的宠物狗

输出会说

找到包含数组字符串的行

这是我所拥有的,但它不起作用。

myArray = ["cat", "dog", "fish"]
File.open('file.txt').each_line { |line|
  puts "Found a line containing array string" if line =~ myArray  #need to fix this logic
}

我已经尝试过include?any?但不知道我是否正确使用它们。

更新:: 我遗漏了一个重要部分。我需要完全匹配!所以如果它不准确,我不希望该语句返回 true。例如 - 如果我的行说“我爱我的宠物狗”,则该语句应该返回 false,因为“狗”在数组中。不是“小狗”

我对糟糕的澄清的错误

4

4 回答 4

3

您必须分别检查数组中的每个字符串,并用于\b匹配单词边界以确保您只获得整个单词:

strings = ["cat", "dog", "fish"].map { |s| Regexp.quote(s) }

File.open('file.txt').each_line do |line|
  strings.each do |string|
    puts "Found a line containing array string" if line =~ /\b#{string}\b/
  end
end

或者构建一个正则表达式:

strings = ["cat", "dog", "fish"].map { |s| Regexp.quote(s) }
pattern = /\b(#{strings.join('|')})\b/

File.open('file.txt').each_line do |line|
  puts "Found a line containing array string" if line =~ pattern
end

调用Regexp.quote可防止在正则表达式中具有含义的字符产生意想不到的效果。

于 2012-09-10T02:34:34.627 回答
1

您可以使用您的数组创建一个正则表达式

myArray = ["cat", "dog", "fish"]
File.open('file.txt').each_line { |line|
  puts "Found a line containing array string" if %r(#{myArray.join('|')}) === line
}
于 2012-09-10T02:37:02.433 回答
0
arr = ['cat', 'dog', 'fish']

File.open('file.txt').each_line do |line|
  puts 'Found a line containing key word' if arr.any? { |e| line.include? e }
end

对于检测为单词而不是子字符串:

line =~ /(#{e}|.*\s#{e})([\s.,:;-].*|\n)/

还有一个有趣的解决方案:

arr = ['cat', 'dog', 'fish']

File.open('file.txt').each_line do |line|
  puts 'Found a line containing array string' if !(line.split(/[\s,.:;-]/) & arr).empty?
end
于 2012-09-10T02:37:40.297 回答
0
myArray = ["cat", "dog", "fish"]
File.open('file.txt').each_line { |line|
  puts "Found a line containing array string" if myArray.any? { |word| /.*#{word}.*/.match? line}
}

代码未测试

于 2012-09-10T02:41:03.383 回答