これらすべてを行う正規表現:
^(.*\[(?![0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\]).*|.*\^(?![BI]).*|([^\^\n]*\^[^B\n])*[^\^\n]*\^B([^\^\n]*\^[^B\n])*[^\^\n]*|([^\^\n]*\^[^I\n])*[^\^\n]*\^I([^\^\n]*\^[^I\n])*[^\^\n]*)$
正規表現対応のテキスト エディターの検索バーにそれを入力するだけで、質問で定義されているエラー行が検出されます。
Notepad++ (Windows) と TextWrangler (Mac) の両方の検索機能を使用してテストしました。Python や、否定先読みをサポートするその他の正規表現でも動作するはずです。検索するときは、「正規表現」または「grep」の横にあるチェックボックスまたは円がチェックされていることを確認してください。grep はルックアラウンドをサポートしていないため、この正規表現はLinux grep では機能しないことに注意してください。
確かにきれいではありませんが、実際には のように一緒にプッシュされた 4 つの小さな正規表現^(rule1|rule2|rule3B|rule3I)$
です。
最初のルールは次のとおりです。
^.*\[(?![0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\]).*$
[00:00:00:00] パターンの一部ではない "[" を含むすべての行に一致し、否定先読みを使用します。
2 番目のルールは次のとおりです。
^.*\^(?![BI]).*$
これは、"^" の直後に B または I が続かない任意の行に一致します。これも否定先読みを使用して、行末にも一致するようにします。
3 番目のルールはお決まりのルールです。
^([^\^\n]*\^[^B\n])*[^\^\n]*\^B([^\^\n]*\^[^B\n])*[^\^\n]*$
^B
これは、太字に使用されるリテラルのインスタンスが 1 つだけある任意の行に一致します。その([^\^\n]*\^[^B\n])*[^\^\n]*
部分は ではないものすべてに一致し^B
、その\^B
部分は 一致し^B
ます。\n
notepad ++での複数行の一致を防ぐために含めました。\n
grep を使用している場合、または行ごとの正規表現検索を既に実行しているプログラムを使用している場合は、's を削除できます。
4 番目のルールは、「B」の代わりに「I」を使用した 3 番目のルールです。