我正在使用libpcre在C语言中编写一个过滤器(在我的例子中,过滤器接受或拒绝字符串)表格中的一些日志行:
tok1=foo tok2=bar ... tok3="value with spaces in it" ...
所以,我过滤它们的方法是从用户那里收到一个形式为:
的过滤字符串"tok1=regex1 tok2=regex2 tok3!=regex3 ..."
开始时,我的引擎会解析此模式,使用pcre_compile / pcre_study编译所有找到的正则表达式,并将它们存储到哈希表(或基数)中。
("tok1"->pcre_regex1, "tok2"->pcre_regex2, "tok3"->pcre_regex3)
(顺便说一句,“!=”运算符用于过滤不包含以下正则表达式的行。)
然后,在过滤阶段本身,对于每个日志行,我从头到尾走线,char by char,我得到令牌/值对,如果有相对于我的哈希表中的令牌的正则表达式,值必须与正则表达式匹配(pcre_exec),否则该行将被拒绝。
工作正常。
我的问题是:我非常怀疑,但我想知道是否有可能编写一个大的正则表达式,它将我的所有正则表达式组合成过滤行并考虑可能的双引号:
pcre_exec(my_big_re, NULL, my_whole_log_line, len, 0, 0, NULL, 0)
何,以及一个附属问题:是否有可能写出任何形式的任何正则表达式的否定? (我也持怀疑态度)
答案 0 :(得分:0)
是的,这是可能的。正则表达式完全等同于有限状态机,并且否定有限状态机(使所有接受状态不接受,反之亦然)是微不足道的。但是,您会发现,在最坏的情况下,这样做会导致指数级更大的正则表达式。