我正在尝试搜索字符串以匹配单词数组。我通过指定一个单词和一个输入来测试代码,并且它正确地找到它,但由于某种原因,我无法让它在一般情况下工作。我检查输入是一个字符串,并从列表中提取单词。任何有关这方面的帮助将不胜感激。感谢。
def self.wordmatch(input, list)
list.each {|word|
if (input =~ /#{word}/i)
puts "#{input} => #{word}"
return 'MATCH'
end
}
end
答案 0 :(得分:1)
这似乎工作正常。你可能会感到困惑的是,如果没有匹配,那么ruby将返回最后一个评估的表达式,在这种情况下是列表。
我不确定你想要在失败的情况下返回这里但是这将返回true / false
def self.wordmatch(input, list)
list.each {|word|
if (word =~ /#{input}/i)
puts "#{input} => #{word}"
return true
end
}
return false
end
以下测试代码
words = %w[a b c]
matches = %w[a b c d]
matches.each do |match|
puts "Testing #{match} = #{wordmatch(match, words)}"
end
产生以下结果
Testing a = true Testing b = true Testing c = true Testing d = false
修改强>
继续发表评论后,这似乎与宣传的完全相同。
def wordmatch(input, list)
list.each {|word|
if (input =~ /#{word}/i)
puts "#{input} => #{word}"
return 'MATCH'
end
}
return nil
end
list = ["hate", "indifference", "love", "foo"]
input1 = "I love summer"
input2 = "I endure summer"
puts "Testing #{input1} = #{wordmatch(input1, list)}"
puts "Testing #{input2} = #{wordmatch(input2, list)}"
并产生以下结果
I love summer => love Testing I love summer = MATCH Testing I endure summer =
答案 1 :(得分:0)
试试这个。我想你让他们倒退了..
def self.wordmatch(input, list)
list.each {|word|
if (word =~ /#{input}/i)
puts "#{input} => #{word}"
return 'MATCH'
end
}
end
http://rubular.com/是一个很好的网站,可以搞砸这些东西。
答案 2 :(得分:0)
我会像这样实现它:
def wordmatch(input, list)
found = input.scan(/\w+/).find {|w| list.include?(w)}
if found
puts found
return "MATCH"
end
end
它将您的input
字符串转换为单词数组,并在其上运行Array#find
以查找数组中包含在list
数组中的第一个单词。
要使其不区分大小写,如果您的列表仅包含小写字词,则可能需要在map(&:downcase)
之前添加find
。
正如其他人所指出的,当找不到匹配项时,您的实现将返回整个列表,因为在这种情况下您没有设置显式返回值。