C中的正则表达式

时间:2009-04-07 13:14:22

标签: c regex

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

谢谢!

7 个答案:

答案 0 :(得分:13)

呃......最好的方法是

#include <regex.h>

这是正则表达式的POSIX standard API

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

考虑一下,我认为glib有一个。

答案 1 :(得分:11)

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

  • POSIX正则表达式可能位于标准C库中 - 请参阅&lt; regex.h&gt;和regcomp,regerror,regexec,regfree。
  • libPCRE提供了perl的大部分扩展正则表达式功能
  • glib有GRegex
  • Henry Spencer's Tcl Regex library

Henry Spencer还做了另一个regex library,由当前版本的TCL和PostgreSQL使用。这个很有意思,因为它是一个混合的NFA / DFA实现。

  

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

     

“NFA”方法跟踪多个当前状态并使用每个传入字符更新所有状态(有关更多说明,请参阅Ross Cox的Thompson NFA regexes文章)。这种方法是O(input.length * pattern.length),它更快 - 在最坏的情况下非常如此 - 但不能执行backrefs或捕获,因为它不跟踪它是如何到达一个州。

     

Spencer的方法是一种混合方法,将模式的某些部分编译为NFA方法,并仅在必要时使用回溯来实现所请求的捕获。这通常是一次实质性的胜利(见TCL的position in the regex-dna shootout)。

答案 2 :(得分:3)

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

这是一个非常好的lib!

答案 3 :(得分:2)

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:0)

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

  

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

答案 6 :(得分:0)