如何使用regexp在Ruby数组中搜索多个元素

时间:2016-10-14 15:27:19

标签: arrays ruby regex search

假设:

my_array = ['america', 'bombay', 'bostwana', 'cameroon']

我可以找到第一个元素的索引,例如,以'bo'

开头
my_array.find_index { |l| l.start_with? 'bo' }

如何找到所有这些元素?

4 个答案:

答案 0 :(得分:1)

您可以将map.with_index与条件compact结果一起使用。

my_array.map.with_index{ |element, index| index if element.start_with? 'bo' }.compact

如何运作

<强>地图

map将获取所有值,并将它们“映射”为每个项目传递到给定块时返回的值。

my_array.map { |element| element.start_with? 'bo' }
# => [false, true, true, false]

<强> with_index

要获取索引值,您可以使用with_index,如下所示:

my_array.map.with_index { |element, index| index }
# => [0, 1, 2, 3]

my_array.map.with_index { |element, index| index if element.start_with? 'bo' }
# => [nil, 1, 2, nil]

<强>紧凑

然后,要删除nil值,可以在返回的数组上调用compact

my_array.map.with_index{ |element, index| index if element.start_with? 'bo' }.compact
# => [1, 2]

答案 1 :(得分:0)

如果你想要元素:

my_array.find { |element| element.start_with? 'bo' }   # => "bombay"
my_array.select { |element| element.start_with? 'bo' } # => ["bombay", "bostwana"]

如果你想要指数:

my_array.index { |element| element.start_with? 'bo' } # => 1
my_array.map.with_index.select { |element, _| element.start_with? 'bo' }.map(&:last)
  # => [1, 2]

答案 2 :(得分:0)

['america', 'bombay', 'bostwana', 'cameroon']
  .each_with_index # to get indices
  .grep(->(e) { e.first.start_with? "bo" }) # I ❤ Enumerable#grep
  .map(&:last) # get indices
#⇒ [1, 2]

我发布了这个以显示很少使用的方法。 Enumerable#grep接受任何内容,用于根据三次相等的案例比较选择项目。

传递Proc个实例很酷,因为Proc有一个默认的Proc#===实现:它只是在接收器上调用。

答案 3 :(得分:0)

为了便于阅读,我将使用以下内容:

my_array.each_index.select {|idx| my_array[idx].start_with?("bo") }