Fast(er) regular expression engines in Ruby
a year ago
- #benchmark
- #regex
- #performance
- SerpApi在从现代网站提取数据时面临挑战,有时不得不使用正则表达式,尽管可能存在延迟问题。
- Ruby的默认正则引擎Onigmo在扫描时间上存在弱点,促使人们探索替代方案,如re2、rust/regex和pcre2。
- re2由谷歌开发,能抵抗ReDoS攻击且有维护良好的Ruby绑定,但在处理Unicode文本时表现不佳。
- rust/regex整体速度最快,尤其擅长Unicode文本,但缺乏即用型Ruby绑定,且在正则集功能上存在局限。
- pcre2被众多产品广泛采用,但其Ruby绑定过时且缺乏JIT支持,导致在对比中可行性较低。
- 基准测试显示rust/regex在多数场景下优于re2和Ruby,特别是处理Unicode文本和复杂模式时。
- re2在ASCII文本和有界重复模式中表现良好,但在Unicode感知匹配器和高最大边界条件下表现欠佳。
- rust/regex的集合功能可能比顺序正则表达式慢,除非精心优化,这凸显了全面测试的必要性。
- re2和rust/regex都能处理无效的UTF-8字节序列,而Ruby遇到此类输入时会失败。
- 最终结论倾向于rust/regex的整体性能和Unicode支持,而re2更适合ASCII文本和抗ReDoS攻击场景。