繁体   English   中英

如何在Node / V8中实现正则表达式匹配?

[英]How is regular expression matching implemented in Node / V8?

我遇到过一篇文章该文章显示正则表达式匹配通常使用可能性能不佳的算法与建议的Thompson NFA算法实现。

考虑到这一点,如何在Node或V8中实现? 是否有可能使用Thompson NFA的JS实现来提高性能,可能只使用了有限的一部分功能(可能删除了前瞻或其他“高级”功能)?

正如Chrome开发团队在本公告中提到的,V8引擎使用Irregexp正则表达式引擎:

以下是有关此引擎实现的一些引用:

我们在设计Irregexp时做出的一个基本决定是,我们愿意花费额外的时间来编译正则表达式,如果这样可以更快地运行它。 在编译期间,Irregexp首先将正则表达式转换为中间自动机表示。 这在很多方面都是“自然”和最易于访问的表示,使得分析和优化正则表达式变得更加容易。 例如,当编译/ Sun | Mon /自动机表示时,我们可以认识到两个选项都有'n'作为第三个字符。 我们可以快速扫描输入,直到找到'n',然后开始匹配前面两个字符的正则表达式。 Irregexp最多可以查找四个字符,一次最多匹配四个字符。

优化后,我们生成本机代码,使用回溯来尝试不同的替代方案。 回溯可能非常耗时,因此我们使用优化来尽可能多地避免回溯。 有一些技术可以完全避免回溯,但JavaScript中regexp的性质使得在我们的案例中很难应用它们,尽管这是我们将来可以实现的。

因此V8会编译为本机自动机表示 - 尽管它不使用Thompson NFA。

至于性能, 本文将V8正则表达式性能与其他库/语言进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM