在Stream上应用正则表达式?

DxC*_*xCK 40 .net c# regex streaming

我正在寻找在Streams上应用正则表达式的快速而安全的方法.

我在互联网上找到了一些关于将每个缓冲区转换为String然后应用于Regex字符串的示例.

这种方法有两个问题:

  • 性能:转换为字符串和GC字符串是浪费时间和CPU,如果有一种更原生的方式应用于RegexStreams ,肯定可以避免.
  • Regex支持:Regex模式有时只有在将两个缓冲区组合在一起时才能匹配(缓冲区1以匹配的第一部分结束,缓冲区2以匹配的第二部分开始).转换为字符串的方式无法原生地处理这种类型的匹配,我必须提供更多信息,例如模式可以匹配的最大长度,这根本不支持+和*正则表达式标志,并且永远不会支持(无限制匹配)长度).

因此,转换为字符串的方式并不快,并且不完全支持Regex.

是否有任何方法/库可用于Regex在Streams 上应用而无需转换为字符串并具有完整的Regex支持?

Dmi*_*huk 7

英特尔最近在BSD许可下开源了Hyperscan库.这是一款基于NFA的高性能非回溯正则表达式引擎.

特点:能够处理输入数据流和同时多个模式匹配.最后一个与(pattern1|pattern2|...)方法不同,它实际上同时匹配模式.

它还使用Intel的SIMD指令集,如SSE4.2,AVX2和BMI.可以在此处找到设计和工作说明的摘要.它还有很好的开发人员参考指南,包含大量解释以及性能和使用注意事项.关于在野外使用它的小文章(俄语).

  • https://github.com/intel/hyperscan - 非常酷,但不是原始问题要求的 .NET 库。 (2认同)

Fry*_*Fry 1

看来您会知道您想要获取的比赛的开始和结束分隔符,对吗?(即 [,] 或 START、END 等)那么,当流中的数据进入时搜索这些分隔符,然后在分隔符之间创建子字符串并对这些分隔符进行进一步处理是否有意义?

我知道这与自己推出几乎是一样的,但它将有更具体的目的,甚至能够在它进来时对其进行处理。

在这种情况下,正则表达式的问题在于它们基于匹配来工作,因此您只能根据您拥有的输入量进行匹配。如果您有一个流,则必须读入所有数据才能获得所有匹配项(空间/时间限制问题),尝试在一次引入的字符上进行匹配(非常无用),以块进行匹配(再次,那里很容易错过一些东西)或生成感兴趣的字符串,如果它们符合您的标准,则可以将其发送到其他地方进行进一步处理。