Использование переменных в регулярных выражениях для поиска строк в Ruby - PullRequest
0 голосов
/ 14 сентября 2010

Я пытаюсь найти строку для поиска по массиву слов. Я проверил код, указав слово, а также ввод, и он правильно нашел его, но по какой-то причине я не могу заставить его работать вообще. Я проверил, что вход является строкой и слова также извлекаются из списка. Любая помощь в этом будет оценена. Спасибо.

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

Ответы [ 3 ]

1 голос
/ 14 сентября 2010

Это, кажется, работает хорошо. Что может вас запутать, так это то, что если соответствия нет, 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

EDIT

Исходя из комментариев, похоже, это работает точно так, как рекламируется.

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 = 
0 голосов
/ 14 сентября 2010

Я бы реализовал это так:

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, если ваш список содержит только строчные слова.

Как отмечали другиеВаша реализация вернет весь список, когда совпадение не будет найдено, поскольку вы не установили явное возвращаемое значение в этом случае.

0 голосов
/ 14 сентября 2010

Попробуй это. Я думаю, что они у вас задом наперед ..


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

http://rubular.com/ отличный сайт, чтобы связываться с этим материалом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...