检查字符串是否包含 Ruby 数组中的任何子字符串

问题描述 投票:0回答:6

我正在使用 Tmail 库,对于电子邮件中的每个附件,当我这样做时

attachment.content_type
,有时我不仅得到内容类型,还得到名称。例子:

image/jpeg; name=example3.jpg

image/jpeg; name=example.jpg

image/jpeg; name=photo.JPG

image/png

我有一组有效的内容类型,如下所示:

VALID_CONTENT_TYPES = ['image/jpeg']

我希望能够检查内容类型是否包含在任何有效的内容类型数组元素中。

在 Ruby 中这样做的最佳方法是什么?

ruby regex substring
6个回答
124
投票

有多种方法可以实现这一目标。您可以使用

Enumerable#any?
:

检查每个字符串,直到找到匹配项
str = "alo eh tu"
['alo','hola','test'].any? { |word| str.include?(word) }

虽然将字符串数组转换为正则表达式可能会更快:

words = ['alo','hola','test']
r = /#{words.join("|")}/ # assuming there are no special chars
r === "alo eh tu"

3
投票

如果

image/jpeg; name=example3.jpg
是字符串:

("image/jpeg; name=example3.jpg".split("; ") & VALID_CONTENT_TYPES).length > 0

即VALID_CONTENT_TYPES 数组和

attachment.content_type
数组(包括类型)的交集(两个数组共有的元素)应大于 0。

这至少是许多方式中的一种。


3
投票

因此,如果我们只想存在匹配项:

VALID_CONTENT_TYPES.inject(false) do |sofar, type| 
    sofar or attachment.content_type.start_with? type
end

如果我们想要匹配,这将给出数组中匹配字符串的列表:

VALID_CONTENT_TYPES.select { |type| attachment.content_type.start_with? type }

2
投票
# will be true if the content type is included    
VALID_CONTENT_TYPES.include? attachment.content_type.gsub!(/^(image\/[a-z]+).+$/, "\1") 

0
投票

我想我们可以把这个问题一分为二:

  1. 如何清理不需要的数据
  2. 如何检查清理后的数据是否有效

第一个问题在上面已经得到了很好的回答。对于第二个,我会执行以下操作:

(cleaned_content_types - VALID_CONTENT_TYPES) == 0

这个解决方案的好处是,您可以轻松创建一个变量来存储不需要的类型,以便稍后列出它们,如下例所示:

VALID_CONTENT_TYPES = ['image/jpeg']
cleaned_content_types = ['image/png', 'image/jpeg', 'image/gif', 'image/jpeg']

undesired_types = cleaned_content_types - VALID_CONTENT_TYPES
if undesired_types.size > 0
  error_message = "The types #{undesired_types.join(', ')} are not allowed"
else
  # The happy path here
end

0
投票

我使用下一个助手:

class String

    # line.includes_any? ['keyword_1', 'keyword_2']
    # line.includes_any? 'keyword_1', 'keyword_2'
    def includes_any?(*arr)
        arr.flatten.any? { self.include? _1 }
    end

end
© www.soinside.com 2019 - 2024. All rights reserved.