使用このリンク(?!dalvikvm\b)\b\w+
正規表現を使用して、タグ を含むメッセージを除外するフィルターを作成できましたdalvikvm
が、、、、など、正規表現のさまざまなバリエーションを試しましたが(?!dalvikvm-heap\b)\b\w+
、メッセージを削除できないようです。理想的には、両方をフィルターしたいのですが、その部分もまだわかりません。(?!dalvikvm\\-heap\b)\b\w+
(?!dalvikvm[-]heap\b)\b\w+
dalvikvm-heap
ご協力いただければ幸いです。
ベストアンサー1
代わりにタグ フィールドで を使用します^(?!dalvikvm)
。これにより、タグが「dalvikvm」で始まらないメッセージのみが表示されます。
以下は、これがどのように動作するかについてのメモです。興味がない場合は、読み飛ばしてください。まず、「この文字列は正規表現に一致しますか?」という質問は、実際には「この文字列に正規表現に一致する位置がありますか?」という意味であることを覚えておく必要があります。
否定アサーションの難しいところ(?!x)
は、文字列の次の部分が一致しない場所であればどこでも一致することですx
。しかし、これは文字列「dalvikvm」の先頭以外のすべての場所に当てはまります。リンク先のブログ投稿では、\b
末尾に を追加して、式が「dalvikvm」の直前以外の場所でのみ一致するようにしています。そしては単語境界です。しかし、文字列の末尾が単語境界であり、その後に「dalvikvm」がないため、これは依然として一致します。そのため、ブログ投稿ではその後に を追加して\w+
、単語境界の後にはさらに単語文字が必要であることを示しています。
まさにそのケースでは機能しますが、正規表現を作成する方法としては少々奇妙で、評価に比較的コストがかかります。また、お気づきのとおり、これを に適用することはできません(?!dalvikvm-heap\b)\b\w+
。「-」は非単語文字であるため、その直後に単語境界があり、その後に単語文字が続き、「dalvikvm-heap」が続かないため、その時点で正規表現が一致します。
代わりに、文字列の先頭にのみ一致する を否定アサーションとともに使用します^
。全体として、正規表現は文字列の先頭にのみ一致し、文字列の先頭の後に「dalvikvm」が続かない場合にのみ一致します。つまり、「dalvikvm」や「dalvikvm-heap」には一致しません。正規表現エンジンは先頭にのみ一致する可能性があることを認識しているため、評価コストも低くなります。
正規表現をこのように作成すると、複数のタグをまとめるだけでフィルタリングできます。たとえば、^(?!dalvikvm)(?!IInputConnectionWrapper)
文字列の先頭に最初のタグが続かず、2 番目のタグも続かないため、「dalvikvm」または「IInputConnectionWrapper」で始まるタグがフィルタリングされます。
ところで、リンクをありがとうございます。logcat フィルターをそのように使用できるとは知りませんでした。リンクがなければ答えは出なかったでしょう。