检查字符串是否匹配

时间:2019-04-24 03:34:31

标签: 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

5 个答案:

答案 0 :(得分:2)

给出以下固定的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

答案 1 :(得分:1)

让我们来修复您的代码。

hostname = "TETDC3DBE01"

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

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

match给出结果数组,并且 match?为您带来的是真还是假的值

答案 2 :(得分:1)

签出Array#any?方法。

它将集合的每个元素传递到给定的块。如果该块曾经返回false或nil以外的值,则该方法返回true。如果未给出该块,则Ruby添加一个{ |obj| obj }的隐式块,如果至少一个集合成员不是false或nil,则将导致any?返回true。

如果提供了一个模式,则该方法返回是否为任何集合成员pattern === element

在您的情况下:

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

,或者即使您实际上是用 match 来表示等于

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

答案 3 :(得分:0)

在这种情况下,我不会使用regexp。简单的String#include?可能更快。此外,如果数组引线中的任何元素都匹配,则any?将返回true

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

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

答案 4 :(得分:0)

使用正则表达式非常简单:

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

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