关于正则表达式解析器的C实现的建议

关于正则表达式解析器的C实现的建议,c,regex,parsing,recommendation-engine,C,Regex,Parsing,Recommendation Engine,我正在考虑在我正在开发的C库中实现一个正则表达式解析器。现在的问题是:是否有任何开源代码我可以一字不差地使用或尽可能少地修改?我对守则的期望如下: 它需要用C语言编写(不是C++) 它需要在gcc、mingw、M$VC下编译 它不能依赖于任何第三方或特定于操作系统的头文件/库(即,编译它所需的一切都必须在基本安装gcc、mingw、M$VC时随时可用) 如果它使用与Perl兼容的正则表达式语法(如PHP中的PCRE),那就太好了 理想情况下,代码应该尽可能紧凑 有什么现成的解决方案可以推荐吗

我正在考虑在我正在开发的C库中实现一个正则表达式解析器。现在的问题是:是否有任何开源代码我可以一字不差地使用或尽可能少地修改?我对守则的期望如下:

  • 它需要用C语言编写(不是C++)
  • 它需要在gcc、mingw、M$VC下编译
  • 它不能依赖于任何第三方或特定于操作系统的头文件/库(即,编译它所需的一切都必须在基本安装gcc、mingw、M$VC时随时可用)
  • 如果它使用与Perl兼容的正则表达式语法(如PHP中的PCRE),那就太好了
  • 理想情况下,代码应该尽可能紧凑
有什么现成的解决方案可以推荐吗?我在看PCRE for C,它似乎拥有PHP中可用的一切(哪些规则),但大小(1.4MB DL)有点吓人。你认为这是一个可靠的赌注吗?或者还有其他值得考虑的选项吗

[编辑]


我正在开发的库是开放源码的,BSD许可证。

PCRE很大,因为正则表达式很难实现。而且大部分都是文档和支持代码;编译成目标代码时要小得多。

PCRE几乎是regex实现的事实标准(这是一个很好的理由)。不要担心大小,它很大,因为正则表达式实现很复杂。不管怎样都可以使用它。

如果您对POSIX正则表达式语法感到满意,您可以尝试TRE。如果您想要Perl语法,Google有一个新的实现值得检查。

,Google正则表达式实现在线性时间内进行匹配(
O(n)
如果
n
是字符串的长度),PCRE和大多数其他regexp引擎在最坏情况下以指数时间运行。另一个值得注意的
O(n)
regexp matcher是,但它在编译时需要所有可能的regexp。如果您正在寻找比PCRE更小的东西,请查看中的regexp matcher或中的模式matcher。

您将在什么许可证下发布库?PHP是在C上构建的。如果PHP将PCRE用于C,我不会感到惊讶。@Jefromi:谢谢您的提问关于这件事,我忘了添加那条信息。我已经更新了问题。@Benedict:我想是的:)M$?认真地这就像十年前一样酷。正则表达式并不难;PCRE只是膨胀了,上次我检查它是
O(2^n)
。一个完整的POSIX正则表达式实现的重量应小于10k(x86机器代码);我不确定Perl风格的正则表达式(它甚至不是一种常规语言),因为它有各种奇怪的扩展,但我严重怀疑PCRE如此大是否有合理的理由。PCRE之所以是O(2^n),是因为它支持Perl风格的正则表达式(支持反向引用)。您是否编写了回溯正则表达式实现?你说它不难,或者它应该有多大?显然,对于许多纯正则的、非反引用的表达式来说,它是
O(2^n)
,但上次我检查它也有非常糟糕的渐近行为(可能只是
O(n^2)
O(nm)
),至于它应该有多大,我瞥了一眼TRE(虽然它使用渐进有效的算法,但代码相当臃肿),发现相关
.o
文件的总
大小(1)
大约为19k。在阅读了一些详细的代码之后,我很快估计您可以减少大约一半的代码大小,同时提高性能(大部分是通过简化数据结构和提前将故障案例隔离到单个检查)。这就是我估计的10k的来源。TRE说它有O(nm^2)。突然间,O(nm)听起来不那么糟糕。我承认TRE的情况非常令人信服,但我不认为PCRE是一个错误的选择。推荐糟糕的代码,因为它是“事实上的标准”,因为foo是“复杂的”(提示:它不是),这不是一个好建议。我不推荐它,因为它是复杂的。我说PCRE“几乎是事实上的标准”。我不认为这是坏代码。@ MiGo,即使C++中有GUTS,也不能用C代码包装它吗?你所说的编译器都是C++的,不是真的。这个库不是我的财产,我只是一个共同维护者。策略相当严格:所有代码都是用C编写的,然后在上面加上一个C++包装器。我真的没有能力影响这件事。