web-dev-qa-db-ja.com

Rubyの配列に部分文字列が含まれているかどうかを確認します

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でそうするための最良の方法は何でしょうか?

34
Hommer Smith

この質問は2つに分けることができると思います。

  1. 不要なデータを消去する方法
  2. クリーニングされたデータが有効かどうかを確認する方法

最初の回答は上記のとおりです。 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
bonafernando

それを実現する方法は複数あります。 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"
87
cydparser

したがって、一致の存在だけが必要な場合:

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 }
3
angusiguess
# will be true if the content type is included    
VALID_CONTENT_TYPES.include? attachment.content_type.gsub!(/^(image\/[a-z]+).+$/, "\1") 
2
noob

image/jpeg; name=example3.jpgが文字列の場合:

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

つまり、VALID_CONTENT_TYPES配列とattachment.content_type配列(タイプを含む)の共通部分(2つの配列に共通する要素)は0より大きい必要があります。

manyの方法の少なくとも1つです。

2
Simon Bagreev