0

私は車のメーカーのリストを持っています

 makes = [acura, honda, ford]

そして、文字列の配列を反復処理して、個々の文字列にこれらの make のいずれかが含まれているかどうかを調べ、含まれている場合は、その特定の make を配列に入れようとしています

だから私は持っている

strings.each do |string|

  if string.include?(*makes)

  else

  end
end

splat プロセスの現在の引数を使用して、どの make が文字列と一致したかを判断するにはどうすればよいですか? これを行う方法はありますか?

編集:以下のコメントに投稿したように、真/偽の回答ではなく、返される特定のメイクを探しています。したがって、文字列が「New toyota celica」の場合、戻り値は「toyota」になります。

4

3 に答える 3

3

使用Enumerable#any?:

makes = ['acura', 'honda', 'ford']
strings = ['hyundai acura ford', 'sports car']

strings.each do |string|
  p makes.any? { |make| string.include? make }
end

正規表現を使用する代替: ( を参照Regexp::union)

strings = ['hyundai acura ford', 'sports car']
makes = ['acura', 'honda', 'ford']
pattern = Regexp.union(makes)

strings.each do |string|
  p string.match(pattern) != nil
end

アップデート

strings.each do |string|
  p makes.find { |make| string.include? make }
end

また

strings.each do |string|
  p makes.select { |make| string.include? make }
end
于 2013-11-02T12:24:15.197 に答える
0

別の方法として、配列を交差させます。

makes = ["acura", "honda", "ford"]

strings = [
"I own a Toyota and a Ford",
"My friend Becky loves her Acura",
"I plan to buy a BMW",
"I now have an Acura, but have had both a honda and a Ford"
]

strings.each do |s|
  a = s.scan(/(\w+)/).flatten.map(&:downcase) & makes
  puts "#{s}\n" + (a.empty? ? "  No matches" : "  Matches: #{a.join}")
end

I own a Toyota and a Ford
  Matches: ford
My friend Becky loves her Acura
  Matches: acura
I plan to buy a BMW
  No matches
I now have an Acura, but have had both a honda and a Ford
  Matches: acura honda ford

scan後者では句読点が問題になるため、 ではなく正規表現を使用する必要があることに注意してくださいsplit(たとえば、「Acura」は一致しません)。

于 2013-11-03T00:07:54.410 に答える