Eam*_*nne 16 .net regex performance big-o
编辑2:为了实际演示为什么这仍然很重要,今天看看 stackoverflow自己的正则表达式导致的停机(2016-07-20)!
编辑:自从我第一次提出这个问题以来,这个问 请参阅下面的两个快速+兼容但不完全全功能的实现.如果你知道更多或更好的实现,请提及它们,这里仍然没有理想的实现!
有没有人知道正常的非回溯(System.Text.RegularExpressions回溯)线性时间正则表达式实现.NET或本机和从.NET合理使用?为了有用,它需要:
存在这样的算法(这是基本的自动机理论......) - 但是有没有可从.NET访问的实际可用的实现?
我喜欢使用正则表达式进行快速和脏的文本清理,但我反复讨论perl/java/python/.NET使用的常见回溯NFA实现显示指数行为的问题.遗憾的是,一旦您开始自动生成正则表达式,这些情况就很容易触发.当您在匹配相同前缀的正则表达式之间切换时,即使非指数性能也会变得非常差 - 例如,在一个非常基本的示例中,如果您使用字典并将其转换为正则表达式,则期望可怕的性能.
为了快速了解为什么存在更好的实现并且从60年代开始,请参阅正则表达式匹配可以简单快速.
不幸的是,这两个实现都是C++,并且需要从.NET使用互操作.
csh*_*net 11
首先,你的建议是可能的,你当然知道你的主题.您还知道不使用反向引用实现的权衡是内存.如果你足够控制你的环境,这可能是一个合理的方法.
在继续之前我唯一要评论的是,我会鼓励您质疑使用RegEx的选择.您显然更熟悉您的具体问题以及您尝试解决的问题,因此只有您可以回答这个问题.我认为ANTLR不是一个好的选择; 但是,家庭酿造规则引擎(如果范围有限)可以根据您的具体需求进行高度调整.这一切都取决于您的具体问题.
对于阅读此内容并且"忽略了重点"的人,这里有一些背景阅读:
在同一个站点上,此页面上链接了许多实现.
上述文章整个讨论的要点是,最好的答案是同时使用两者.为此,我所知道的唯一广泛使用的实现是TCL语言使用的实现.据我所知,它最初是由Henry Spencer编写的,它采用了这种混合方法.有一些尝试将它移植到ac库,虽然我不知道任何广泛使用.Walter Waldo和Thomas Lackner都在这里被提及和链接.还提到了boost库,虽然我不确定实现.您还可以查看TCL代码本身(从其站点链接)并从那里开始工作.
简而言之,我会选择TRE或Plan 9,因为这些都得到了积极的支持.
显然,这些都不是C#/ .Net,我不知道是哪一个.