Ruby:在字符串中查找前N个正则表达式匹配(并停止扫描)

想要扫描非常长的字符串以进行正则表达式匹配。 想知道找到第一个N正则表达式的最有效方法是什么。 例如:

'abcabcabc'.scan /b/, limit: 2 

如果只扫描支持限制选项,则会在5个字符后成功结束。

(该字符串是几MB – 内存中的一个memoized数据结构 – 这是一个Web请求.Per很重要。)

不是那么优雅,但你可以使用块forms:

 str = 'abcabcabc' result = [] str.scan(/b/) { |match| result << match; break if result.size >= 2 } result #=> ["b", "b"] 

幸运的是,Ruby regex支持延迟匹配 ,因此您可以像这样使用它:

 'abcabcabc'.match(/(b).*?(b)/) 

添加? 之后.*让它变得懒散,一旦正则表达式完成就停止。 从Regexp类重复文档 :

默认情况下,重复是贪婪的:尽可能多地匹配,同时仍然允许整体匹配成功。 相比之下,延迟匹配使得整体成功所需的匹配量最小。 使用?后可以使贪婪的元字符变得懒惰。