Проверьте, совпадает строка или нет

#ruby

#ruby

Вопрос:

У меня есть строка и массив с некоторыми строками. как показано ниже

 hostname = TETDC3DBE01

Array  = ['WEB','APP','STR','DBE']
  

Я хочу выяснить, совпадает ли это имя хоста с каким-либо элементом массива или нет?

Когда я пытаюсь с помощью приведенного ниже кода получить вывод

 no
no
no
no
  

Здесь цикл повторяет каждый элемент в массиве. Я хочу проверить это имя хоста с помощью одной проверки в массиве, чтобы выдать вывод только «да» или «нет».

 Array.each do |x|
  if hostname.match(x)
    puts "yes"
  else
    puts "no"
  end
end
  

Комментарии:

1. Во-первых, вы не должны переопределять Array. 'TETDC3DBE01'.match('WEB') # nil 'TETDC3DBE01'.match('APP') # nil 'TETDC3DBE01'.match('STR') # nil все nil, поэтому они не совпадают, что вы на самом деле пытаетесь сделать?

2. Теперь я хочу выводить только «да»

3. Не hostname.match(x) работает?

4. Попробуйте ['WEB','APP','STR','DBE'].map { |s| hostname.match?(/#{s}/) ? 'yes' : 'no' } #=> ["no", "no", "no", "yes"] . Вы хотите hostname = 'TETDC3DBE01' (т. Е. в одинарных или двойных кавычках). Лучше отредактируйте это сейчас, прежде чем это привлечет отрицательные голоса..

5. Я выхожу как «нет, нет, нет, да», я хочу только «да» или «нет

Ответ №1:

Учитывая этот исправленный код Ruby:

 hostname = 'TETDC3DBE01'

array  = ['WEB','APP','STR','DBE']
  

Где, если вы хотите найти все элементы в array , которые совпадают в качестве подстроки hostname , ваш код должен работать. Более минимальная система сопоставления, вероятно,:

 array.select { |x| hostname.match(x) }
# => ["DBE"]
  

Использование такого инструмента, как puts для получения выходных данных, не всегда очень полезно, потому что текст «да» или «нет» не может быть обработан дополнительным кодом. Попробуйте представить программы Ruby как цепочку преобразований, где выбираются все совпадения, а позже вы можете распечатать их, вот так:

 puts array.select { |x| hostname.match(x) }.join(',')
# => DBE
  

Ответ №2:

Проверьте Array#any? метод.

Он передает каждый элемент коллекции в данный блок. Метод возвращает значение true, если блок когда-либо возвращает значение, отличное от false или nil. Если блок не задан, Ruby добавляет неявный блок, { |obj| obj } который заставит any? возвращать значение true, если хотя бы один из элементов коллекции не равен false или nil.

Если вместо этого предоставляется шаблон, метод возвращает значение pattern === element для любого элемента коллекции.

В вашем случае:

 hostname = 'TETDC3DBE01'
['WEB','APP','STR','DBE'].any? do |x|
  hostname.match(x)
end
  

или даже если вы на самом деле подразумеваете равный под совпадением:

 hostname = 'TETDC3DBE01'
['WEB','APP','STR','DBE'].any?(hostname)
  

Ответ №3:

Давайте возьмем ваш код, чтобы исправить это.

 hostname = "TETDC3DBE01"

arr  = ['WEB','APP','STR','DBE']

 arr.each do |x|
  if hostname.match?(x)
   puts "yes"
  else
   puts "no"
  end
end
  

match выдает массив результата и
match? выдает значение true или false

Ответ №4:

Я бы не стал использовать regexp в этом случае. Простой String#include? , вероятно, быстрее. Кроме того, any? вернет true , соответствует ли какой-либо из элементов в лидах массива.

 hostname = 'TETDC3DBE01'
array  = ['WEB','APP','STR','DBE']

array.any? { |x| hostname.include?(x) }
#=> true
  

Ответ №5:

Регулярное выражение стало очень простым:

 hostname = "TETDC3DBE01"
array  = ['WEB','APP','STR','DBE']

re = Regexp.union(array)
hostname.match?(re)  # => true