0

私は、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)

(ちなみに、「!=」演算子は、次の正規表現を含まない行をフィルタリングするために使用されます。)

次に、フィルタリングフェーズ自体で、すべてのログ行について、行を最初から最後まで1文字ずつ歩き、トークンと値の組み合わせを取得します。ハッシュテーブルにトークンに関連する正規表現がある場合は、値が一致する必要があります。正規表現(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 に答える