String#scan未捕获所有出现的

时间:2015-06-23 14:11:56

标签: ruby regex

我面对一个非常奇怪的行为,使用ruby String#scan method return。我在下面有这个代码,但我无法找到原因" scan"不会返回2个元素。

str = "10011011001"
regexp = "0110"
p str.scan(/(#{regexp})/)

==> [["0110"]]

String" str"显然包含2个模式" 0110"。 我当然想要获取我的正则表达式的所有出现。

你知道吗?

2 个答案:

答案 0 :(得分:5)

原因是在找到第一个结果后,正则表达式引擎继续在第一个结果后的位置行走。因此,第一个结果末尾的零不能重复用于其他结果。

获得重叠结果的方法是将模式放在前瞻和捕获组中(前瞻只是零宽度断言(测试)并且不消耗任何字符)。通过这种方式,正则表达式引擎一次只能前进一个字符,并且可以测试字符串中的所有位置,即使在组中捕获了某些内容:

(?=(yourpattern))

然后您的结果在捕获组1

用你的例子:

p str.scan(/(?=(0110))/)
[["0110"], ["0110"]]

答案 1 :(得分:1)

str = "10011011001"
match = "0110"

str.chars.each_cons(match.size).map(&:join).select { |cons| cons == match }

应该这样做。