こんにちは、
バックグラウンド:
私は Checkstyle 4.4.2 と RegExp チェッカー モジュールを使用して、Java ソース ヘッダーのファイル名が、それらが存在するクラスまたはインターフェイスのファイル名と一致しないことを検出しています。これは、開発者があるクラスから別のクラスにヘッダーをコピーし、「File:」タグを変更しない場合に発生する可能性があります。
RexExp チェッカーでの正規表現の使用は、多くの具体化を経ており、(現時点ではやり過ぎかもしれませんが) 次のようになります。
File: (\w+)\.java\n(?:.*\n)*?(?:[\w|\s]*?(?: class | interface )\1)
私がチェックしているファイルの基本的な形式は(非常に単純化されていますが)、次のようになります
/*
*
* Copyright 2009
* ...
* File: Bar.java
* ...
*/
package foo
...
import ..
...
/**
* ...
*/
public class Bar
{...}
問題:
一致が見つからない場合(つまり、「File: Bar.java」を含むヘッダーがファイル Bat.java にコピーされた場合)、非常に長いファイルで StackOverflowError を受け取ります (私のテストケースは @1300 行です)。
私はいくつかの視覚的な正規表現テスターで実験しましたが、正規表現エンジンがクラスまたはインターフェース名を含む行を通過すると、一致しない場合に、次の行で再び検索を開始し、おそらく StackOverflowError を引き起こすバックトラッキングを行うことがわかります。
質問:
正規表現を変更して StackOverflowError を防ぐ方法
一致しない場合 (つまり、 "File: Bar.java" を含むヘッダーがファイル Bat.java にコピーされた場合) を含む行を調べると、一致が停止するように正規表現を変更する方法はありますか?インターフェイスまたはクラス名を調べて、「\1」が最初のグループと一致しないことを確認します。
あるいは、それが可能な場合、インターフェイスまたはクラスを含む行を調べた後に行われる検索とマッチングを最小限に抑えて、処理と (できれば) StackOverflow エラーを最小限に抑えることは可能ですか?