在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次出现。
答案 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
匹配。