.net - .NET 正规表达式 实现,可以处理生成的正规表达式: *non backtracking*,O(n)?

  显示原文与译文双语对照的内容
144 0

这是一个实际的演示,它是一个很重要的例子,看看今天的正则表达式是否导致了今天出现的中断。

这个问题从我第一次问它以来已经有了很大的进展。 以下是两个 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的语法更加详细,当然可以使构造不能生成有效的解析器,因这里你需要找到一些安全子集。
良好的实现:

不幸的是,这两个实现都是 C++,需要从. NET. 使用互操作

时间: 原作者:

113 5

首先,你的建议是可能的,你肯定知道你的主题。 你还知道,不使用反向引用实现的交换是内存。 如果你控制你的环境,这可能是一个合理的方法。

在继续之前我将要注意的唯一事情是,我鼓励你问一下使用 正规表达式的选择。 显然你更熟悉你的具体问题和你试图解决的问题,所以你只能回答这个问题。 我不认为tmodel会是一个好的选择;但是,Homebrew 规则引擎( 如果范围范围有限) 可以高度调优你的特定需求。 这完全取决于你的具体问题。

对于阅读这个和'缺少点'的读者来说,下面是一些背景读物:

同一站点上,在这个页面上有许多实现链接。

对于上述文章的全部讨论是最好的答案是使用这两者。 为此,我知道的唯一广泛使用的实现是TCL语言所使用的实现。 我理解它最初是由Henry编写的,它采用了这种混合方法。 尽管我没有意识到将它的移植到c 库,但是我还没有注意到这一点。 沃尔特和waldo的的Walter都在这里提到和 还提到了库,尽管我不太确定实现。 你还可以查看TCL代码本身( 从的网站链接。) 并从那里工作。

简而言之,我将使用 TRE或者计划 9,因为它们都是主动支持的。

显然这些都不是 C#/.Net,我也不知道。

原作者:
115 0

如果你可以使用不安全的代码( 许可问题),那么你可以从 ( 这个 Windows 端口) 获取实现。

你可以将这里直接用于下面的p/invoke和显式布局结构:


typedef int regoff_t;


typedef struct {


 size_t re_nsub;/* Number of parenthesized subexpressions. */


 void *value;/* For internal use only. */


} regex_t;



typedef struct {


 regoff_t rm_so;


 regoff_t rm_eo;


} regmatch_t;



typedef enum {


 REG_OK = 0,/* No error. */


/* POSIX regcomp() return error codes. (In the order listed in the


 standard.) */


 REG_NOMATCH,/* No match. */


 REG_BADPAT,/* Invalid regexp. */


 REG_ECOLLATE,/* Unknown collating element. */


 REG_ECTYPE,/* Unknown character class name. */


 REG_EESCAPE,/* Trailing backslash. */


 REG_ESUBREG,/* Invalid back reference. */


 REG_EBRACK,/*"[]" imbalance */


 REG_EPAREN,/*"()" or"()" imbalance */


 REG_EBRACE,/*"{}" or"{}" imbalance */


 REG_BADBR,/* Invalid content of {} */


 REG_ERANGE,/* Invalid use of range operator */


 REG_ESPACE,/* Out of memory. */


 REG_BADRPT/* Invalid use of repetition operators. */


} reg_errcode_t;



然后使用能够处理带有嵌入空值的字符串的导出( 具有宽字符支持)


/* Versions with a maximum length argument and therefore the capability to


 handle null characters in the middle of the strings (not in POSIX.2). */


int regwncomp(regex_t *preg, const wchar_t *regex, size_t len, int cflags);



int regwnexec(const regex_t *preg, const wchar_t *string, size_t len,


 size_t nmatch, regmatch_t pmatch[], int eflags);



或者通过 C++/CLI 解决方案包装它,更容易翻译和更灵活的( 我肯定建议这是明智的,如果你舒适的C++/cli ) 。

原作者:
76 2

在哪里可以找到可靠的快速 正规表达式 实现?

你不能

有人必须说,这个问题的答案确定是你不能找到的,你不可以能找到匹配约束的实现。

我相信你已经尝试过,但是你已经编译了 正规表达式 ( 使用输出到程序集的选项) - 我说,因为:

如果你有一个复杂的正规表达式 和数百万个短字符串

119 1

考虑如何从 正规表达式 创建 DFAs:

你从一个正则表达式开始。 每个操作( concat,联合,Kleene闭包) 代表中状态之间的转换。 dfa的结果状态代表了NFA中状态的幂集。 rtc中的状态与正则表达式的大小线性,因这里rtc的状态指向正则表达式的大小。

所以你的第一个约束

最大的时间复杂度的正规表达式 评估的O ( m*n ),它的中m 是 正规表达式的长度,输入的长度为n 。

不可能 正规表达式 需要编译为 2 ^m-state ( 最坏情况),这不会在线性时间内完成。

除了最简单的正规表达式,总是这样的情况。 那么简单,你就可以轻松地编写一个快速 .contains 表达式。

原作者:
134 3

快速评论:只是因为你可以模拟多个状态,并不意味着你没有进行of转换。 区别在于你在搜索本身上分配了努力。 换句话说,最差情况的性能不变。

原作者:
...