.net – 可以处理机器生成的正则表达式的正则表达式实现:*无回
编辑2:为了一个实际的演示,为什么这仍然是重要的,看起来不超过
stackoverflow’s own regex-caused outage today (2016-07-20)!
编辑:自从我第一次问到这个问题以来,这个问题已经有了很大的看到下面两个快速兼容但不完全功能齐全的实现.如果你知道更多或更好的实现,请提及它们,这里还没有一个理想的实现! 在哪里可以找到可靠的快速Regex实现? 有没有人知道正常的非回溯(System.Text.RegularExpressions回溯)线性时间正则表达式实现,对于.NET或本机,可从.NET中合理使用?为了有用,需要: >具有O(m * n)的正则表达式估计的最差情况时间复杂度,其中m是正则表达式的长度,n是输入的长度. 奖金积分: 如果实现了基于堆栈的功能,它可以以消耗O(n m)存储器而不是O(m)存储器为代价处理嵌套来实现实惠的积分. 存在这样的算法(这是基本的自动机理论…) – 但是有什么实用的实现可以从.NET访问? 背景:(你可以跳过这个) 我喜欢使用Regex进行快速和脏的文本清理,但是我一再遇到问题,perl / java / python / .NET使用的常见回溯NFA实现显示指数行为.不幸的是,一旦开始自动生成正则表达式,这些情况就很容易触发.当您在正确的匹配相同的前缀之间进行交替时,即使非指数性能也会变得非常差 – 例如,在一个非常基本的例子中,如果您使用字典并将其转换为正则表达式,则会导致可怕的性能. 要快速了解为什么更好的实现存在并且自60年代以来,请参阅Regular Expression Matching Can Be Simple And Fast. 不太实用的选择: >几乎理想:FSA toolkit.可以将正则表达式编译成DFA的NFA的快速C实现,也允许传感器(!)具有包含交叉和参数化语法的一级正则表达式(封装yay!).但它是在prolog …(为什么这种实用功能的东西在主流语言中不可用) 良好的实施: > RE2 – 一个谷歌开源库,旨在合理的PCRE兼容性减去反向引用.笔者认为这是plan9的正则表达式lib的unix端口的继承者. 不幸的是,两个实现都是C,并且需要从.NET使用互操作.
首先,你的建议是可能的,你当然知道你的主题.您还知道,不使用反向引用实现的权衡是内存.如果您足够控制您的环境,这可能是一个合理的方法.
在继续之前,我唯一要评论的是我鼓励你质疑使用RegEx的选择.你显然更熟悉你的具体问题,你想解决什么,只有你能回答这个问题.我不认为ANTLR是一个很好的选择;然而,家庭酿造规则引擎(如果范围有限)可以高度调整您的具体需求.这一切都取决于你的具体问题. 对于那些读这个和“缺点”的人来说,这是一些背景阅读: > Regular Expression Matching Can Be Simple And Fast 从同一个网站,有一些实现linked on this page. 上述文章的整个讨论的要点是,最好的答案是使用两者.为此,我所知道的唯一广泛使用的实现是TCL语言所使用的实现.据我所知,这是最初由亨利·斯潘塞(Henry Spencer)编写的,它采用了这种混合方式.尽管我不知道有哪些广泛使用,但已经尝试将其移植到c库中. Walter Waldo和Thomas Lackner’s都被提到和linked here.还提到了boost library虽然我不确定的实现.您还可以查看TCL代码本身(从their site链接)并从那里工作. 总之,我会和TRE或Plan 9一起去,因为这两个都是积极的支持. 显然这些都不是C#/ .Net,我不知道是哪一个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- apt-get install安装软件问题(安装包的依赖库版本过高问题)
- comps.xml文件定制
- 在C#中创建Guid键与DB之间的区别
- postgresql – 从Postgres JDBC表中读取Spark的速度很慢
- Proactor和Reactor模式_继续并发系统设计的扫盲
- oracle – PL / SQL ORA-01422:精确的提取返回超过请求的行
- ruby-on-rails – Rails:用户的最佳关联模型 – >帖子 –
- 如何在ruby proc / lambda中使用真正的局部变量
- ruby-on-rails – Sidekiq / Airbrake仅在重试熄灭时发布异
- ruby-on-rails – Rails – 太阳黑子条件模型索引