我有一个字符串,如下所示:搜索一个字母的所有出现偏移字符串
--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
我正在寻找的答案其实在这个问题上: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)。
所以,虽然我仍然完全不明白这个部分,但至少上面的答案帮助我找到所有的事件。
作为一种变体:
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]
当模式是单个字符时,这很好地工作,但如果它是一个正则表达式,则不会。 – dbenhur 2013-03-22 15:56:54
Regexp#match
只运行一次模式。 MatchData
可以包含多个匹配,因此可以包含multiple offsets。第一个是整个匹配,其他是正则表达式中捕获组的内容。 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]
谢谢,但我仍然不明白为什么它不包含所有匹配,根据核心文档(http://www.ruby-doc.org/core-2.0/MatchData.html )听起来应该是这样,除非我失去了一些东西。 – mydoghasworms 2013-03-22 11:42:02
@mydoghasworms'#match'只运行一次正则表达式。 MatchData包含整个比赛和每个捕获组的偏移量。 – dbenhur 2013-03-22 15:35:46
当'index'直接返回所需的偏移量时,为什么要循环匹配和匹配数据? – dbenhur 2013-03-22 15:59:52