我有一个字符串如下:
--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
将匹配字符串中所有出现的正则表达式。
我有一个字符串如下:
--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
将匹配字符串中所有出现的正则表达式。
要获得偏移量,您可以使用如下循环:
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
Regexp#match
只运行一次模式。MatchData
可以包含多个匹配项,因此可以包含多个偏移量。第一个是整个匹配,其他是正则表达式中捕获组的内容。正则表达式的多次应用导致 MatchData 中没有任何内容。
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]
我正在寻找的答案实际上是在这个问题上:如何获取字符串中所有出现的 Ruby 正则表达式的匹配数据?
就像我说的,我认为 MatchData 结果应该包含所有匹配项。(我从这里的 Ruby 核心文档中得到了这个印象:http ://www.ruby-doc.org/core-2.0/MatchData.html )。
因此,虽然我仍然不完全理解那部分,但至少上面的答案可以帮助我了解所有情况。
作为变体:
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]