【发布时间】:2017-07-10 20:35:05
【问题描述】:
在 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 次出现。
【问题讨论】:
-
我假设您要查找的
offset来自MatchData,在这种情况下请查看"How do I get the match data for all occurrences of a Ruby regular expression in a string?"。一旦你有所有出现的MatchData,你就可以索引到数组中并为特定的出现获取它。 (虽然在给定的正则表达式中你想要offset(0),因为正则表达式中没有任何额外的捕获组) -
谢谢。我假设您正在谈论操纵链接中的答案 - “my_string.to_enum(:scan, my_regex).map { Regexp.last_match }”,但我不清楚如何更改它以适应第 n 个匹配我发现的。
-
map返回一个数组,所以它只是my_string.to_enum(:scan, my_regex).map { Regexp.last_match }[n - 1].offset(0)如果我正确理解所有内容(n - 1 表示第 n 个偏移量,因为基于 0 的索引),它应该可以满足您的需求。所以str.to_enum(:scan, /\-/).map { Regexp.last_match }[1].offset(0)=>[5, 6] -
@SimpleLime, "my_string.to_enum(:scan, my_regex).map { Regexp.last_match }[n - 1].offset(0)" 似乎正在工作。如果你想把它作为答案,我会接受。
-
当然,最初并没有将其作为答案,因为我不确定这是否足够接近以成为该问题的“重复”,但是已经完善了其他答案对于您的情况,可能需要的答案不是 cmets
标签: ruby-on-rails ruby regex lastindexof