require 'enumerator' #Only for 1.8.6, newer versions should not need this.
s = "AustinTexasDallasTexas"
positions = s.enum_for(:scan, /Texas/).map { Regexp.last_match.begin(0) }
class String
def indices e
start, result = -1, []
result << start while start = (self.index e, start + 1)
result
end
end
p "AustinTexasDallasTexas".indices /Texas/
=> [6, 17]
3条答案
按热度按时间41ik7eoe1#
使用Ruby 1.8.6+,你可以这样做:
字符串
这将创建一个数组,其中:
型
6l7fqoea2#
例如:
String#index
字符串
现在,您可以扩展String API。
型
jdgnovmf3#
字符串
或
型
这使用了String#gsub的形式(未充分利用),它有一个参数,没有块,并返回一个枚举器。
这种形式的
gsub
被认为与替换字符串中的子字符串无关。相反,它只是枚举其参数的匹配项。可以说,它应该是一个单独的字符串方法,可能命名为each_match
。我发现这种形式的
gsub
有很多用途,这有点离题,但考虑到人们普遍缺乏对如何利用它的认识,让我给予另一个使用它的例子。假设我们有一个字符串
型
并希望返回一个数组,该数组包含所有连续字符的子串,这些子串都是相等的(即
["aa", "ccc"]
)。我们可以通过匹配
型
如果我们使用String#scan,
型
这个返回值--这不是我们想要的--反映了
scan
在其参数是包含捕获组的正则表达式时的工作方式。相反,如果我们使用
gsub
,我们得到的字符串