我有一个字符串和一个包含一些字符串的数组。 如下
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
答案 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