我有一个数组:
array = ["abhor", "rage", "mad"]
我想检查一个字符串是否包含该数组中的任何单词 - 但只包含该单词(不是子字符串)。
string = 'I made a cake.'
count = 0
array.each do |word|
if string.include? word
count += 1
end
end
但是,上面的内容会将count
增加1,因为它会从我的字符串中的word
中获取mad
made
。我怎样才能搜索疯狂并确保made
不被计算?
答案 0 :(得分:3)
array intersection operator &
在这里很有用。
这里有两个选项,具体取决于您定义“单词”的方式:
1)如果一个单词是任何非空白字符序列,那么你可以这样做:
array & string.split
在您的示例中,这会导致数组和字符串中的单词交叉,这是空的。
2)如果一个单词是包含_的任何字母数字字符序列,那么你可以这样做:
array & string.scan(/\w+/)
例如,如果array = ["abhor", "rage", "mad", "cake"]
,那么上面的#1将为空(因为您的cake.
在字符串中有句点)但是会为方法#2返回['cake']
。
答案 1 :(得分:2)
我会这样做:
array = ["abhor", "rage", "mad"]
string = 'I made a cake.'
string.split.count{|word| array.include?(word)}
答案 2 :(得分:1)
进行简单拆分的问题在于它不会考虑标点符号。你需要的是正则表达式,这有点复杂。
array.each do |word|
count += 1 if string.match(/\W#{word}\W/)
end
答案 3 :(得分:0)
首先尝试拆分单词。
words = string.split
count = 0
words.each do |word|
count += 1 if array.include? word
end
答案 4 :(得分:0)
如果你愿意沿着正则表达式路走下去,\ b代表一个单词边界。此示例包含句子中的所有单词以及一些作为片段的单词,正确返回4。
array = ["abhor", "rage", "mad", "I", "made", "a", "cake", "cak"]
string = 'I made a cake.'
count = 0
array.each do |word|
if string =~ /\b#{word}\b/
count += 1
end
end