我面对一个非常奇怪的行为,使用ruby String#scan method return。我在下面有这个代码,但我无法找到原因" scan"不会返回2个元素。
str = "10011011001"
regexp = "0110"
p str.scan(/(#{regexp})/)
==> [["0110"]]
String" str"显然包含2个模式" 0110"。 我当然想要获取我的正则表达式的所有出现。
你知道吗?答案 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 }
应该这样做。