6

PowerGrep で正規表現を使用して多数のファイルを検索しています。私はJavaファイルを扱っています。私の目標は、ログを追加できるように、ブロック内に単語を含まないすべてのcatchブロックを見つけることです。log多くのファイルがあるため、手動でそれらを調べることは実際には不可能です。

見つけるべきものの例

catch (Exception e) {
    //comment#
    int math = 1 +2 * (3);
    String email = "email@example.com";
    anothermethod.call();
    //no logging
}  

catch(AnotherException e ) {}    //no logging

見つけてはいけないものの例

catch(AnotherException e ) {  
     //some code
     log.error("Error message");
     //some more code 
}

catch(BadE_xception e) { log.error(e); }      

私は正規表現の経験があまりありませんが、これは私がこれまでに持っているものです:

catch ブロックの開始:catch\s*\(\s*\w*\s+\w*\s*\)\s*\{.*?

しかし、そこから not contain を指定するためにどこに行くべきかわかりませんlog。正規表現なしでこれを行う方法についてのアイデアがあれば、それは私にとっても完璧に機能します. ありがとう

4

1 に答える 1

8

少なくとも、ネストされたケースの有限レベルを取得できます。

ネストされていない場合、式の末尾を変更します。

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^}](?!\blog\b))*\}
                                ^^^^^^^^^^^^^^^^^^^^^^

これを分解しましょう。

  1. }非文字を厳密に検討しています。したがって[^}]。最初の が見つかったら、完了}です。
  2. これは、否定先読みアサーション(?!foo)と呼ばれます。「この点の後には が続かない」という意味です。foo
  3. \b単語境界です。s で囲むことlogで、\b"clog" や "logical" などの "誤検知" を検出しないようにします。「ログ」という唯一の単語が必要です。
  4. (?:foo)、キャプチャせずに式をグループ化する方法です。これは重要ではありません(foo)。その目的は、グループ全体を によって定量化できるようにすること*です。
  5. すべてをまとめると、文字ごとにチェックしており、それぞれが aではなく、それぞれの後に単語全体が続いていません}log

これにより、単語logがネストされていない catch ブロック内のどこにもないことが保証されます。

次に、ネストされたケースに移ります。@TimPietzcker が指摘したように、PowerGREP はまだ再帰式をサポートしていませんが、目的のためには、有限数のネストに満足するかもしれません。1レベルのネストの式を次に示します。

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^}](?!\blog\b))*\})*\}
                                     ^             ^========================

{そのキャラクターを嫌いなキャラクターのクラスに追加しました。これは、この文字に遭遇した場合、代替 ( ) を介し|てネストされたケースに切り替えたいためです。これは、記号の下線が引かれた部分を比較するとわかるよう=に、元の「内部」式の正確なコピーです。この方法で好きなだけネストを続けて、任意の数のバランスの取れたネストをキャプチャできます。


これは、10 レベルのネスティングのテンプレートです。これは、この種のほとんどのアプリケーションに十分なはずです。

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED)*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}

SEED再帰シードはどこにありますか[^{}](?!\blog\b)。必要に応じて再帰を削除または追加することが視覚的に簡単になるように、このように記述しました。展開すると、上記は次のようになります。

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b))*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}
于 2013-07-10T20:27:00.500 に答える