我正在寻找在流上应用正则表达式的快速且安全的方法。
我在互联网上找到了一些例子,这些例子讨论了将每个缓冲区转换为字符串,然后在字符串上应用 Regex
。
这种方法有两个问题:
- 性能:转换为字符串并对字符串进行 GC 处理会浪费时间和 CPU,如果有更原生的方法在 Streams 上应用
Regex
肯定可以避免。 - 纯
Regex
支持:Regex
模式有时只有在将两个缓冲区组合在一起时才能匹配(缓冲区 1 以匹配的第一部分结束,缓冲区 2 以比赛的第二部分)。转换为字符串的方式无法原生处理这种类型的匹配,我必须提供更多信息,例如模式可以匹配的最大长度,这根本不支持 + 和 * 正则表达式符号,永远不会支持(无限匹配长度)。
因此,转换为字符串的方式并不快,并且不完全支持Regex
。
是否有任何方法/库可用于在 Streams 上应用 Regex
而无需转换为字符串并具有完整的 Regex 支持?
最佳答案
英特尔最近开源了hyperscan BSD 许可证下的库。它是一个高性能的非回溯基于 NFA 的正则表达式引擎。
特点:能够处理输入数据流和同时进行多种模式匹配。最后一个不同于 (pattern1|pattern2|...)
方法,它实际上同时匹配模式。
它还利用英特尔的 SIMD 指令集,如 SSE4.2、AVX2 和 BMI。 可以找到工作设计和解释的摘要here . 它还具有出色的开发人员 reference guide有很多解释以及性能和使用注意事项。 小article关于在野外使用它(俄语)。
关于c# - 在 Stream 上应用正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1962220/