在regex中使用变量在Ruby中进行字符串搜索

时间:2010-09-14 14:07:09

标签: ruby regex

我正在尝试搜索字符串以匹配单词数组。我通过指定一个单词和一个输入来测试代码,并且它正确地找到它,但由于某种原因,我无法让它在一般情况下工作。我检查输入是一个字符串,并从列表中提取单词。任何有关这方面的帮助将不胜感激。感谢。

def self.wordmatch(input, list)
  list.each {|word|
  if (input =~ /#{word}/i)
    puts "#{input} => #{word}"
    return 'MATCH'
  end
  }
end

3 个答案:

答案 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

正如其他人所指出的,当找不到匹配项时,您的实现将返回整个列表,因为在这种情况下您没有设置显式返回值。