如何在第n次出现正则表达式结束的字符串中找到索引?

时间:2017-07-10 20:35:05

标签: ruby-on-rails ruby regex lastindexof

在Ruby 2.4中使用Rails 5.0.1。如何在第n次正则表达式结束的字符串中找到索引?如果我的正则表达式是

/\-/

和我的字符串

str = "a -b -c"

我正在寻找我的正则表达式第二次出现的最后一个索引,我希望答案是5.我试过这个

str.scan(StringHelper::MULTI_WHITE_SPACE_REGEX)[n].offset(1)

但是遇到了错误

NoMethodError: undefined method `offset' for "             ":String

在上面,n是一个整数,表示我想要扫描的正则表达式的第n次出现。

3 个答案:

答案 0 :(得分:0)

这样做的一种方法:

def index_of_char str, char, n
  res = str.chars.zip(0..str.size).select { |a,b| a == char }
  res[n]&.last
end

index_of_char "a -b -c", '-', 0
#=> 2

index_of_char "a -b -c", '-', 1
#=> 5

index_of_char "a -b -c", '-', 2
#=> nil

index_of_char "abc", '-', 1
#=> nil

可以进一步优化。

答案 1 :(得分:0)

对于之前的快速阅读感到抱歉。也许这种方法可以帮助您找到元素第n个occorunce的索引。虽然我无法在红宝石中使用严格的正则表达式找到一种方法。希望这会有所帮助。

def index_of_nth_occorunce(string, element, nth_occurunce)
  count = 0
  string.split("").each_with_index do |elm, index| 
    count += 1 if elm == element
    return index if count == nth_occurunce
  end
end

index_of_nth_occorunce("a -b -c", "-", 2) #5

在进行了一些进一步的挖掘后,我可能已经在这个堆栈帖子(ruby regex: match and get position(s) of)中找到了您正在寻找的答案。希望这也有帮助。

nth_occurence = 2 
s = "a -b -c"
positions = s.enum_for(:scan, /-/).map { Regexp.last_match.begin(0) }
p positions[nth_occurence - 1] # 5

答案 2 :(得分:0)

从我从related question的链接发展而来的评论:

该问题的答案

"abc12def34ghijklmno567pqrs".to_enum(:scan, /\d+/).map { Regexp.last_match }

可轻松调整以获取单个项目的MatchData

string.to_enum(:scan, regex).map { Regexp.last_match }[n - 1].offset(0)

在字符串中找到n匹配。