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