使用偏移量搜索字符串中所有出现的字母

时间:2013-03-22 08:54:16

标签: ruby

我有一个字符串如下:

--d--d-d---d--

我想在这个字符串中找到所有出现的'd'及其偏移量。

但是,执行以下操作只会让我回到第一个结果:

irb(main):001:0> m = /d/.match "d--d-d---d"
=> #<MatchData "d">
irb(main):002:0> m.size
=> 1 

我做错了什么?我以为match会匹配字符串中所有出现的正则表达式。

4 个答案:

答案 0 :(得分:0)

要获得偏移量,您可以使用如下循环:

s = '--d--d-d---d--'
offset = 0
while md = /d/.match(s,offset)
  p md.offset(0)[1]          
  # MatchDate#offset Returns a two-element array 
  # containing the beginning and ending offsets 
  offset = md.offset(0)[1]
end

答案 1 :(得分:0)

我正在寻找的答案实际上就这个问题:How do I get the match data for all occurrences of a Ruby regular expression in a string?

就像我说的那样,我认为MatchData结果应该包含所有匹配项。 (我在Ruby核心文档中得到了这个印象:http://www.ruby-doc.org/core-2.0/MatchData.html)。

因此,虽然我仍然不完全理解这一部分,但至少上面的答案可以帮助我解决所有问题。

答案 2 :(得分:0)

作为变体:

str = '--d--d-d---d--'
str.each_char.with_index.select{|el| el[0] == "d"}.map(&:last)

结果:

[2, 5, 7, 11]

字母的位置从0开始。如果你需要从1开始使用with_index(1),那么结果将是:

[3, 6, 8, 12]

答案 3 :(得分:0)

Regexp#match只运行一次模式。 MatchData可以包含多个匹配,因此multiple offsets。第一个是整个匹配,其他是正则表达式中捕获组的内容。 MatchData中没有任何内容来自regexp的多个应用程序。

String#index直接产生偏移,可以很容易地用来遍历字符串。

s = '--d--d-d---d--'
[].tap{ |offsets| i=-1; while i = s.index('d', i+1); offsets << i; end }
=> [2, 5, 7, 11]