检查数组元素是否显示在线上
我正逐行阅读文件,我想检查该行是否包含数组中的任何元素。 例如,如果我有:
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,因为“dog”在数组中。 不是“小狗”
我对错误澄清的错误
您必须单独检查数组中的每个字符串,并使用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
可防止在正则表达式中具有意义的字符产生意想不到的效果。
你可以使用你的数组创建一个正则表达式
myArray = ["cat", "dog", "fish"]
File.open('file.txt').each_line { |line|
puts "Found a line containing array string" if %r(#{myArray.join('|')}) === line
}
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}
}
代码未经测试
链接地址: http://www.djcxy.com/p/25687.html