0

我正在用 C 语言编写一个带有 libpcre 的引擎,该引擎过滤(在我的情况下,过滤器接受或拒绝字符串)以下形式的一些日志行:

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)

(顺便说一下,“!=”运算符用于过滤不包含以下正则表达式的行。)

然后,在过滤阶段本身,对于每个日志行,我从头到尾逐个字符地遍历该行,我得到令牌/值对,如果在我的哈希表中存在相对于令牌的正则表达式,则值必须匹配正则表达式 (pcre_exec) 否则该行被拒绝。

它工作正常。

我的问题是:我非常怀疑,但我想知道是否可以编写一个大的正则表达式,将我所有的正则表达式组合起来过滤行,并考虑到可能的双引号:

pcre_exec(my_big_re, NULL, my_whole_log_line, len, 0, 0, NULL, 0)

何,还有一个附属问题:是否可以写任何形式的任何正则表达式的否定?(我也很怀疑)

4

1 回答 1

0

是的,这是可能的。正则表达式完全等同于有限状态机,对有限状态机求反(使所有接受状态不接受,反之亦然)是微不足道的。但是,您会发现在最坏的情况下这样做会导致正则表达式呈指数级增长。

于 2013-01-23T20:58:47.347 回答