检查数组元素是否在线

时间:2012-09-10 02:30:03

标签: ruby arrays string contains

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

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?,但不知道我是否正确使用它们。

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

我对糟糕澄清的错误

4 个答案:

答案 0 :(得分: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

或者构建一个Regex:

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会阻止正则表达式中有意义的字符产生意外效果。

答案 1 :(得分:1)

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

myArray = ["cat", "dog", "fish"]
File.open('file.txt').each_line { |line|
  puts "Found a line containing array string" if %r(#{myArray.join('|')}) === line
}

答案 2 :(得分: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

答案 3 :(得分: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}
}

未经过测试的代码