Ruby:从Array / String Matchdata收集索引

时间:2014-04-14 07:43:56

标签: ruby arrays regex string match

我是Ruby的新手,这是我的问题:我想迭代一个Array或String来获取与Regex匹配的字符索引。

示例数组/字符串

 a = %q(A B A A C C B D A D)
 b = %w(A B A A C C B D A D)

我需要的是变量a或b之类的东西;

#index of A returns;
[0, 2, 3,8]

#index of B returns
[1,6]

#index of C returns
[5,6]
#etc

我已经尝试过狡猾了

z = %w()

a =~ /\w/.each_with_index do |x, y|

 puts z < y

end
但是,这并没有很好的锻炼。 任何解决方案?

3 个答案:

答案 0 :(得分:3)

对于数组,您可以使用

b.each_index.select { |i| b[i] == 'A' }

对于字符串,您可以先将其拆分为数组(a.split(/\s/))。

答案 1 :(得分:1)

如果您希望将每个字符的索引作为哈希值,则可以使用:

b = %w(A B A A C C B D A D)

h = {}
b.each_with_index { |e, i|
  h[e] ||= []
  h[e] << i
}
h
#=> {"A"=>[0, 2, 3, 8], "B"=>[1, 6], "C"=>[4, 5], "D"=>[7, 9]}

或作为&#34;单行&#34;:

b.each_with_object({}).with_index { |(e, h), i| (h[e] ||= []) << i }
#=> {"A"=>[0, 2, 3, 8], "B"=>[1, 6], "C"=>[4, 5], "D"=>[7, 9]}

答案 2 :(得分:0)

如果要计算每个字母的出现次数,可以定义辅助方法:

def occurrences(collection)
  collection = collection.split(/\s/) if collection.is_a? String

  collection.uniq.inject({}) do |result, letter|
    result[letter] = collection.each_index.select { |index| collection[index] == letter }
    result
  end
end

# And use it like this. This will return you a hash something like this: 
# {"A"=>[0, 2, 3, 8], "B"=>[1, 6], "C"=>[4, 5], "D"=>[7, 9]}
occurrences(a)
occurrences(b)

这应该适用于String或Array。