我逐行浏览文件,我想检查该行是否包含数组中的任何元素。例如,如果我有:
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”在数组中。不是“狗狗”
我对糟糕澄清的错误
答案 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}
}
未经过测试的代码