構造的検索および置換の例
ご存知のように、通常の検索と構造検索の主な違いは、構造検索ではプログラミング言語の構造テンプレートを探していることです。
構造検索の利点は、既存のテンプレートに基づいてパターンを作成し、コードの検索と置換にかかる時間を節約できることです。
既存のテンプレートの広範なリストは、単純なパターンからより複雑なパターンまで、多くのユースケースをカバーしています。
パターン内の各アイテムは、両側の $ 記号によって制限される変数で構成されます。
パターンの例
簡単なタスクから始めて、 synchronized キーワードを使用して開いているロックオブジェクトを検索しましょう。 synchronized キーワードには、次の 2 つのケースがあります。
ブロックステートメントとして
class ClassA { public void someMethod() { synchronized(this) { // ... } } }メソッド修飾子として
class ClassA { public synchronized void someMethod() { // ... } }
そのようなものを探しましょう
$parameter$ 変数フォーム 0 のカウント修飾子を無限大に追加できます。 パターンは、任意の数のパラメーターを使用してすべての同期可能なメソッドを検索できますが、本体には 1 行のコードしかありません。 これを修正するために、$statement$ 変数にも同じゼロから無限大の制限を設定しました。
1 つのステートメント
出現箇所数を特定の数に増やすと、指定した数の要素を含むステートメントのシーケンスを見つけることができます。
メソッド呼び出し
このテンプレートは、メソッド呼び出し式に一致します。 出現回数がゼロの場合は、メソッド呼び出しを省略できることを意味します。
このテンプレートを使用して、推奨されないメソッドを見つけ、他のアノテーション付きメソッドテンプレートを作成するためのプロトタイプとして使用することができます。 特に非推奨メソッドへのメソッド呼び出しを検索する場合は、非推奨メソッドへの既存のテンプレート 非推奨メソッドの呼び出し を選択できます。
検索テンプレートの作成の詳細については、「構造検索と置換 」を参照してください。
If ステートメント
コメントと文字列リテラルで検索する
ある人が 'foo' を含むコメントやリテラルを探したいと考えてください。 検索テンプレートは $SomethingWeWantToFind$ または "$SomethingWeWantToFind$" のようになります。 ある特定の単語(たとえば、単語としての foo)を含むコメント / 文字列を探したい場合は、これをテキスト制約として指定する必要があります。
try/catch/finally コードを追加する
文を try/catch/finally 構文に置き換えたい場合、検索と置換のテンプレートの次のペアを提案できます。 検索テンプレートは次のとおりです。
特定の最大発生数を制約として指定します。
置換テンプレートは次のとおりです。
クラスのすべての子孫または特定のインターフェースを実装するすべてのクラスを見つける
次の検索テンプレートを検討してください。
または
変数 $AnotherClass$ または $SomeInterface$ のテキスト制約として、基本クラスまたは実装されたインターフェースの名前を指定します。
同様のメソッドをすべて検索する
同じインターフェースメソッドのさまざまな実装を探すには、次の検索テンプレートを使用します。
$show$ 変数にテキスト制約を指定し、オプション この変数は検索の対象です を有効にします。
@Modifier を使用してパッケージのローカルメソッドとインスタンスメソッドを検索する
IntelliJ IDEA は、クラスの パッケージローカルフィールドおよび インスタンスフィールドのための事前定義されたテンプレートを提案します。 これらのテンプレートは、自然言語で表現できない場合に検索対象を記述するのに役立つ @Modifier 注釈を使用します。
ただし、パッケージローカルまたはインスタンスメソッドを検索する必要がある場合は、対応する検索テンプレートを自分で作成し、 @Modifier アノテーションを適用する必要があります。
可視性修飾子パッケージ local および instance を使用してすべてのメソッドを検索するための基準を指定するには、次の検索テンプレートを使用します。
検索に '含める制約' フィールドを使用する
既存の例では、次のテンプレートを使用しています。
_a と _st が変数で * が 含める制約 フィールドの 0 以上の出現箇所を示す if('_a) { '_st*; } を配置し、 完全一致 変数の 条件の反転 チェックボックスを選択すると、 if ステートメントに含まれていないロギングステートメントの検索が行われます。
HTML と XML の例
次の例は、HTML および XML コードで構造検索を使用する方法を示しています。
XML および HTML タグ、属性、それらの値の検索
タグを検索する最も簡単なテンプレートは <$tag$/> です。
変数
$tag$に制約を設定することにより、検索するタグを指定できます。 例:liを指定すると、すべてのliタグが取得されます。次の XML および HTML での検索テンプレートを考えてみましょう:
<$tag$ $attribute$=$value$ />。 例えば、$attribute$変数にidテキストフィルターを指定し、$value$変数に\d+正規表現をテキストフィルターとして指定すると、id属性に数値を持つすべてのタグを見つけることができます。
id 属性が 2 より大きい行をすべて削除する
HTML ファイルを作成し、次のコードを貼り付けます。
<!doctype html> <html> <head> <title>Structural Search Example</title> <body> <ul> <li id="1">Example line 1</li> <li id="2">Example line 2</li> <li id="3">Example line 3</li> <li id="a">Example line a</li> <li id="5">Example line 5</li> </ul> </body> </html>メインメニューで へ移動します。
言語(L) リストから HTML を選択してください。
次の文字列を 検索テンプレート フィールドに貼り付けます。
<$tag$ $attribute$="$value$">$tag$変数をクリックします。フィルターパネルで、 修飾子の追加 をクリックし、 テキスト を選択して、値フィールドに
liと入力します。フィルターパネルが表示されていない場合は、
検索演算子パネルの切り替え をクリックします。

$attribute$変数をクリックします。フィルターパネルで、 修飾子の追加 をクリックし、 テキスト を選択して、値フィールドに
idと入力します。$value$変数をクリックします。フィルターパネルで、 修飾子の追加 をクリックし、 テキスト を選択して、値フィールドに
\d+と入力します。\d+正規表現は、検索結果を数値に制限します。 そのため、id="a"のある行は除外されます。フィルターパネルからフォーカスを切り替えずに、 追加 ボタンをクリックし、 スクリプト を選択して、次のコードを貼り付けます。
value.getText().replaceAll (/"/, '').toInteger() > 2スクリプトは
$value$変数の内容を読み取り、それを文字列として返します(たとえば、"1")。 次に、スクリプトはすべての引用符を置き換え、文字列値を整数に変換して、2と比較します。
li タグのクラス属性の大文字の値を小文字に変換する
HTML ファイルを作成し、次のコードを貼り付けます。
<!doctype html> <html> <head> <title class="EXAMPLE">Structural Replace Example</title> <body> <ul> <li class="EXAMPLE">Example line 1</li> <li class="example">Example line 2</li> <li class="EXAMPLE">Example line 3</li> <li class="example">Example line a</li> <li id="EXAMPLE">Example line 5</li> </ul> </body> </html>メインメニューで へ移動します。
言語(L) リストから HTML を選択してください。
次の文字列を 検索テンプレート フィールドに貼り付けます。
<$tag$ $attribute$="$value$">大/小文字を区別する (C) のチェックボックスを選択します。
$tag$変数をクリックします。フィルターパネルで、 修飾子の追加 をクリックし、 テキスト を選択して、値フィールドに
liと入力します。$attribute$変数をクリックします。フィルターパネルで、 修飾子の追加 をクリックし、 テキスト を選択して、値フィールドに
classと入力します。$value$変数をクリックします。フィルターパネルで、 修飾子の追加 をクリックし、 テキスト を選択して、値フィールドに
[A-Z].*と入力します。[A-Z].*正規表現は、検索結果を大文字に制限します。ターゲット(T) リストから 値 を選択してください。 この手順では、
class属性のすべての大文字の値をハイライトします。置換テンプレート フィールドに、
$to_lower_case$変数を貼り付けます。$to_lower_case$変数をクリックします。フィルターパネルで、 修飾子の追加 をクリックし、 スクリプト を選択して、次のコードを貼り付けます。
value.getText().toLowerCase()
検索 をクリックします。
検索 ツールウィンドウで、見つかった結果をプレビューし、 すべて置換(A) をクリックします。
