我正在寻找C / C ++中的正则表达式库,它不提供通用的API正则表达式(字符串,模式),而是允许构建有限状态机(基于模式)而我只是调用
fsm = create_fsm();
add_pattern(fsm, "foo", hookFoo);
add_pattern(fsm, "bar", hookBar);
compile_fsm(fsm);
while ((c = fgetc(file) != EOF) {
next_char(fsm, c);
}
如果模式匹配,会调用hookFoo(匹配开始,匹配结束)吗? 或类似的东西,这只是概念。我想在长而长的行中搜索多个regexp。理想情况下,如果它也可以反向填充以进行向后搜索。 由于表达式仅在运行时期间已知,因此Flex(或类似的解析器生成器)不是一个选项。
修改: 虽然我已将lexertl标记为正确答案,但似乎并非我所寻找的。它需要回流;我不想使用记忆来记住过去(除了常量大小,例如记住最后一个字符)。想象一下,当我调用++ iterator时,所有其他迭代器都应该失效。
答案 0 :(得分:2)
看起来lexertl对您的要求很有帮助。它支持在运行时添加正则表达式和“可重新启动”词法分析器。它会为每个公认的“规则”提供一个令牌。
boost::spirit::lex使用lexertl作为默认实现,并添加了语义操作。
答案 1 :(得分:1)
您可以使用#include<regex.h>
提供的功能开发自己的功能,例如regcomp
和regexec
例如
int match_patterns(char *pch,char *pattern)
{
regex_t *regex;
regmatch_t *result;
int err_no = 0;
int start = 0;
regex = (regex_t *) calloc(1,sizeof(regex_t));
if((err_no = regcomp(regex, pattern, REG_EXTENDED)) != 0)
{
size_t length;
char *buffer;
length = regerror (err_no, regex, NULL, 0);
buffer = malloc(length);
regerror (err_no, regex, buffer, length);
free(buffer);
regfree(regex);
return -1; //error
}
result = (regmatch_t *) calloc(1,sizeof(regmatch_t));
if(result == NULL)
{
return -1; //error
}
while(regexec(regex, pch+start, 1, result, 0) == 0)
{
start +=result->rm_eo;
}
regfree(regex);
free(regex);
if((result->rm_so == 0)&&(result->rm_eo == strlen(pch)))
{
return 0; //OK
}
return -1; //error
}
如果pch
字符串与regexp模式pattern
匹配,则此函数将返回0,否则返回-1。
例如
int main()
{
if (match_patterns("1234.abc", "[0-9]+.[a-d]+")==0)
printf("OK!\n");
else
printf("NOK!\n");
}
在这种情况下,match_patterns()
将返回0
如果您使用此功能,请不要忘记添加以下iclude:
#include<regex.h>
#include<string.h>
答案 2 :(得分:1)
有来自英特尔的超扫描库。它提供了 api 来搜索数据流中的多个正则表达式。见http://intel.github.io/hyperscan/dev-reference/runtime.html#streaming-mode
答案 3 :(得分:0)
经过一些谷歌搜索后,我发现了RE2库http://code.google.com/p/re2/ - 这说明是一个快速的实现(速度可与grep或awk相媲美),背景中有正确的理论,可以提供内存限制。 RE2 :: FindAndConsume似乎是正确的API。
编辑:不(再次)。 FindAndConsume只在一个字符串中找到incrementaly匹配但不允许传递数据流的多个块:(顺便说一句,当找到匹配时,机器返回以查看匹配实际开始的位置(尽管这不是很大)问题,因为在前向搜索期间不应该这样做,例如 lexertl 。