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

min*_*gos 6 c regex parsing recommendation-engine

我正在考虑在我正在开发的C库中实现正则表达式解析器.现在,问题是:是否有任何开源代码,我可以逐字使用或尽可能少的更改?我对代码的期望是:

  • 它需要用C语言编写(而不是C++)
  • 它需要在gcc,mingw,M $ VC下编译
  • 它不能依赖于任何第三方或特定于操作系统的头文件/库(即,编译它所需的一切必须随时可以通过gcc,mingw,M $ VC的基本安装获得
  • 如果它使用Perl兼容的正则表达式语法(如PHP中的PCRE)会很好.
  • 理想情况下,代码应尽可能紧凑

您可以推荐任何现成的解决方案吗?我正在看PCRE for C,看起来它拥有PHP中可用的所有内容(规则),但是大小(1.4MB DL)有点令人生畏.你认为这是一个坚实的赌注吗?或者还有其他值得考虑的选择吗?

[编辑]

我正在开发的库是开源的BSD许可证.

Ign*_*ams 7

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

  • 至于它应该有多大,我瞥了一眼TRE(虽然它使用了渐近有效的算法,却有相当膨胀的代码),并且看到相关`.o`文件的总`size(1)`大约是19k .之前已经详细阅读过代码,我很快就估计你可以减少大约一半的代码大小并同时提高性能(大部分都是通过简化数据结构并将故障情况隔离到单个检查提前).这就是我的10k估计来自的地方. (3认同)
  • 正则表达并不难; PCRE刚刚膨胀,最后我检查它是'O(2 ^ n)`.完整的POSIX正则表达式实现应该小于10k(x86机器代码); 我不确定Perl风格的正则表达式(它甚至不是常规语言),因为它有各种奇怪的扩展,但我严重怀疑PCRE是否有合理的原因. (2认同)

pts*_*pts 6

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


dan*_*rth 2

PCRE 几乎是正则表达式实现的事实标准(有充分的理由)。不用担心大小,它很大,因为正则表达式的实现很复杂。无论如何,就用它吧。

  • 因为它是“事实上的标准”并且因为 *foo* 是“复杂的”(提示:事实并非如此)而推荐糟糕的代码并不是一个好建议。 (3认同)