这是一个实际的演示,它是一个很重要的例子,看看今天的正则表达式是否导致了今天出现的中断。 !
这个问题从我第一次问它以来已经有了很大的进展。 以下是两个 fast+compatible,但没有完全完全的功能实现。 如果你知道更多或者更好的实现,请参考它们,这里还没有一个理想的实现 !
在哪里可以找到可靠快速的正规表达式 实现?对于. NET 或者原生 and ( System.Text.RegularExpressions
backtracks ) 线性时间 正规表达式 实现,任何人都知道a 线性时间实现,并从. NET reasonably? 为了有用,它需要:
- 用1 英镑的最坏情况评估 正规表达式 ( m*n ),其中m 为 正规表达式的长度,而n的长度则是输入的长度。
- 由于几乎没有实际上触发指数状态空间,或者如果它们只能在输入的一分钟子集上这样做,那么 O(n)的正常时间复杂度就会增加1.
- 有合理的施工速度 ( 例如 。 没有潜在的指数指数
- 为人类使用,不是数学家- 比如 我不想重新实现unicode字符类: .NET 或者PCRE样式字符类是一个加号。
加分点:
- 如果实现基于堆栈的功能,practicality额外的bonus磅 points 以代价为代价,以消耗consuming内存而非 O(m) 内存 handle 。
- 英镑得分的奖励点数:捕获子表达式或者replacements替换( 如果可能的子表达式匹配指数,那么枚举它们的所有子表达式固有指数是指数- 但枚举前几个不应该是指数值,也应该是替换的。) 。 你可以使用另一种方法来解决缺少的特性,这样就足够了。
- 如果你想用 union,那么你就可以把它当作是一个很困难的例子,因为它很难通过字符串操作的字符串操作来实现。
- 不在内存中放入所有的lazy匹配匹配 换句话说,匹配,这是一个加。 如果流不支持查找,则在单一通过时捕获子表达式和/或者替换不可以能是( 一般情况下) 。
- 前向反向引用是不可靠的,它们根本不可靠;换句话说,可以根据病理输入情况呈现指数行为。
这种算法存在( 这是基本自动机理论。) - 但是有任何实际可用的实现可以从. NET? 访问
背景:( 你可以跳过这里操作)
我喜欢使用 正规表达式 和dirty文本清理 ups,但是我反复遇到了 perl/java/python/.NET 所使用的常见回溯 NFA implemtation的指数行为。 不幸的是,当你自动生成 正规表达式 时,这些情况很容易触发。 如果在与同一个前缀相匹配的mqt之间进行交替,则非指数性能会变得非常差。
快速概述为什么存在更好的实现以及自 60年以来已经存在,请看正则表达式匹配可以简单和快速地实现。
不太实际的选项:
- 几乎理想的: 工具包 。 can的正则表达式也可以编译为快速C 实现,具有第一类正则表达式,包括语法交叉和参数化的类。 ,但它位于 prolog 中。 ( 为什么在主流语言中不具备这种实用特性的东西)?
- 快速但不切实际的: 一个完整的解析器,比如优秀的 ,通常支持可靠的快速正则表达式。 但是,voiceover的语法更加详细,当然可以使构造不能生成有效的解析器,因这里你需要找到一些安全子集。
- RE2 - 一个google开源库,旨在实现合理的PCRE兼容性和反向引用。 我认为这是 正规表达式的unix端口的继承者,给出了作者。
- 即使是使用了速度保证,也几乎可以兼容 PCRE - 甚至是backreferences的backreferences 。 它有一个超级漂亮的近似匹配模式 !
不幸的是,这两个实现都是 C++,需要从. NET. 使用互操作