LoginSignup
0
0

More than 1 year has passed since last update.

mtailで「文字列がマッチしない場合」という否定条件を作る

Last updated at Posted at 2021-10-01

概要

golangの正規表現では文字列がマッチしない否定文(Negative look ahead and behind)がサポートされていない。

そもそも肯定でも否定でも、(?を使うと以下のようにエラーになる。

  • error parsing regexp: invalid or unsupported Perl syntax: (?=
  • error parsing regexp: invalid or unsupported Perl syntax: (?!

mtailというgolangで書かれたログ収集ツールを使っていて、「特定の文字列がマッチしない場合ログを収集する」という条件を付けたいのだが、当然これもサポートされていないし、mtailではgolangそのものを書けるわけではないので、正規表現以外の方法がない。
https://github.com/google/mtail/issues/18

これをどうにか解決した記録。

関連

やりたいこと

文中にERRORを含むがAAAAを含まない、という条件を作りたい。

Text Matched
This is an ERROR. true
This is an ERROR and AAAA. false
This is an ERROR and BBBB. true

通常の正規表現で書くと

通常の正規表現で書くとこんな感じ。

/^(?=.*ERROR)(?!.*AAAA).*$/

mtailでの実現方法

以下のように、条件を入れ子にして、elseを使うことで実現した。

counter error_count

/^.*ERROR.*$/ {
  /^.*AAAA.*$/ {
  } else {
    error_count++
  }
}

否定条件を複数書く場合は以下。
文中にERRORを含むがAAAAもBBBBも含まない。

counter error_count

/^.*ERROR.*$/ {
  /^.*AAAA.*$|^.*BBBB.*$/ {
  } else {
    error_count++
  }
}

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0