C中的正则表达式

我很好奇,有人知道在C中进行正则表达式匹配的好方法吗? 我能想到的唯一方法是通过Flex。 这是唯一的方式还是有更好的方法?

谢谢!

呃……最好的方法是

#include  

这是正则表达式的POSIX 标准API 。

对于非POSIX系统,滚动自己的系统是另一种选择,基本的正则表达式引擎并不难实现。 我确信也有现成的解决方案,我还没有找到。

想想看,我认为glib有一个。

取决于您正在寻找的方言以及您所使用的平台:

  • POSIX正则表达式可能位于标准C库中 – 请参阅和regcomp,regerror,regexec,regfree。
  • libPCRE提供了perl的大部分扩展正则表达式function
  • glib有GRegex
  • Henry Spencer的Tcl Regex库 。

Henry Spencer还完成了另一个正则表达式库 ,由当前版本的TCL和PostgreSQL使用。 这个很有意思,因为它是一个混合的NFA / DFA实现。

以多种方式接受相同字符串的正则表达式(如a * a?)本身就需要NFA。 通常的实现使用回溯将NFA建模为DFA,对于特别简并的模式,其可以与O(2 ^长度(输入))一样多。 但是,简单的递归实现可以通过捕获,反向引用,代码回调以及除了测试匹配之外的许多语言提供的所有常用“额外”function进行扩展。

“NFA”方法跟踪多个当前状态并使用每个传入字符更新所有状态(有关更多解释,请参阅Ross Cox的Thompson NFA正则表达式的写法)。 这种方法是O(input.length * pattern.length),它更快 – 在最坏的情况下非常快 – 但不能执行反向reflection或捕获,因为它不会跟踪它是如何进入状态的。

Spencer的方法是混合方法,将模式的某些部分编译为NFA方法,并仅在必要时使用回溯来实际请求捕获。 这通常是一个巨大的胜利(见TCL 在正则表达式dna枪战中的位置 )。

看这个: http : //www.pcre.org/

这是一个非常好的lib!

一种完全不同的方法是尝试解析表达语法(PEG) 。 从解析器的角度来看,PEG出现了模式匹配问题,甚至可以利用形成完整语法的多个规则。 这使得编写与平衡括号匹配的表达式成为可能,而这些表达式在大多数正则表达式方言中很难表达。

虽然PEG相对较新,但应该有一些可以从C使用的实现。

我个人使用的PEG实现是LPeg 。 它完全与Lua绑定,巧合的是由Lua的一位主要作者Roberto Ierusalimschy撰写。 它提供了完整的PEG实现,还包括一个适配器,可将正则表达式转换为等效的PEG以供执行。

将Lua核心链接到C程序只是为了访问LPeg可能听起来有点过分,但即使你没有计划将Lua用于其他目的,它也不会那么难。

也许这篇文章会有所帮助? 它向您展示了如何使用regex.h定义的正则表达式函数。

是的,不是posix正则表达式真是太棒了他们拥有一切,所以我想知道他们为什么不在C? 好吧,我找到了答案,我很高兴,他们在那里,并且他们是如何使用它们的

提升REGEX