概要
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++
}
}
以上