获取ruby中的字符串扫描结果索引

adn*_*adn 13 ruby indexing

我想获得索引以及扫描结果

"abab".scan(/a/)
Run Code Online (Sandbox Code Playgroud)

我不仅想要

=> ["a", "a"]
Run Code Online (Sandbox Code Playgroud)

还有那些比赛的索引

[1, 3]
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Tod*_*ell 23

试试这个:

res = []
"abab".scan(/a/) do |c|
  res << [c, $~.offset(0)[0]]
end

res.inspect # => [["a", 0], ["a", 2]]
Run Code Online (Sandbox Code Playgroud)

  • @Todd的回答是对的.但是,如果你更愿意避免使用像'$ ~`那样略显神秘的特殊变量,那么`Regexp.last_match`是等价的.即你可以说`Regexp.last_match.offset(0)[0]` (15认同)
  • 甚至是`Regexp.last_match.offset(0).first` (8认同)
  • 对于那些想知道这些方法是如何工作的人,请参阅[`MatchData #offset`](http://ruby-doc.org/core-2.1.1/MatchData.html#method-i-offset)和[`Regexp :: last_match `](http://ruby-doc.org/core-2.1.1/Regexp.html#method-c-last_match) (6认同)

jim*_*jim 6

根据您的预期行为,这里有一个值得关注的问题.

如果搜索/dad/"dadad"你只能得到[["dad",0]],因为scan预付款每场比赛结束的时候找到一个(这是我错了).

我提出了这个选择:

def scan_str(str, pattern)
  res = []
  (0..str.length).each do |i|
    res << [Regexp.last_match.to_s, i] if str[i..-1] =~ /^#{pattern}/
  end
  res
end
Run Code Online (Sandbox Code Playgroud)

如果你想要,你也可以使用标准库中的StringScanner做类似的事情,对于长字符串来说可能会更快.