我很好奇,有人知道在C中进行正则表达式匹配的好方法吗?我能想到的唯一方法是通过Flex。这是唯一的方式还是有更好的方法?
谢谢!
答案 0 :(得分:13)
呃......最好的方法是
#include <regex.h>
这是正则表达式的POSIX standard API。
对于非POSIX系统,滚动自己的系统是另一种选择,基本的正则表达式引擎并不难实现。我确信也有现成的解决方案,我还没有找到解决方案。
考虑一下,我认为glib有一个。
答案 1 :(得分:11)
取决于您正在寻找的方言以及您所使用的平台:
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)