Поиск строки с использованием пользовательского ввода - PullRequest
0 голосов
/ 05 ноября 2018

Моя цель состоит в том, чтобы пользователь ввел строку, чтобы найти строку в массиве. Я использую строки включают? функция для поиска, но она возвращает неправильные данные.

 puts "Enter Artist(all or partial name):"   
 search_artist = gets.chomp
 list.each do |x|
     if x.artist.include? (search_artist)
       num += 1
       x.to_s
     else
       puts "none found"
     end   end

search_artist = 'a' (потому что я ищу AARON ...)

возвращается:

AARON KDL NOT VALID 2
ZAC CHICKEN ROCK 1289
2 records found

должно быть:

AARON KDL NOT VALID 2     
1 record found`

Проблема в том, что обе строки включают в себя «а» где-то в строке. Как мне искать с начала строки?

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Другой вариант, только если поиск ограничен первой буквой, без учета регистра:

found = list.select { |x| [search_artist.downcase, search_artist.upcase].include? x[0] }
found.each { |e| puts e }
puts "Found #{found.size} records"
0 голосов
/ 06 ноября 2018

без регулярных выражений:

puts "Enter Artist(all or partial name):"   
search_artist = gets.chomp

puts list.select do |x|
  x.artist.start_with?(search_artist)
end
0 голосов
/ 05 ноября 2018

Есть действительно простой способ сделать это с помощью grep:

matches = list.grep(search_artist)

if (matches.empty?)
  puts "none found"
end

Для подсчета количества совпадений вы можете просто matches.length.

Если вы хотите совпадение с регистром , тогда вы хотите это:

matches = list.grep(Regexp.new(search_artist, Regexp::IGNORECASE))

Где этот флаг создает регистрозависимое регулярное выражение для более широкого соответствия.

Редактировать : Чтобы привязать этот поиск к началу строки:

matches = list.grep(Regexp.new('\A' + Regexp.escape(search_artist), Regexp::IGNORECASE))

Где \A привязывает начало строки.

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