# 结构搜索和替换示例

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com/zh-cn/help/idea/llms.txt).

正如您所知，常规搜索和结构化搜索之间的主要区别在于，结构化搜索中我们在编程语言中查找结构模板。

结构搜索的美妙之处在于，您可以基于现有模板创建一个模式，在搜索和替换代码时节省时间。

现有模板的广泛列表涵盖了从简单模式到更复杂模式的许多用例。

模式中的每个项目都由变量组成，这些变量两边都被 $ 符号限制。

## 示例模式

让我们从一个简单的任务开始，使用  `synchronized` 关键字搜索一个打开的锁对象。  `synchronized`  关键字可以有两种情况：

* 作为块语句 ``` class ClassA { public void someMethod() { synchronized(this) { // ... } } } ```

* 做为方法修饰符 ``` class ClassA { public synchronized void someMethod() { // ... } } ```

让我们找找类似的东西

```
synchronized ($parameter$){
$statement$;
}

```

我们可以为 $parameter$ 变量添加 Count 修饰符，从 0 到无限大。 所以，该模式可以搜索具有任意数量参数但体内只有一行代码的所有 synchronizable 方法。 我们还为 $statement$ 变量设置了同样的从零到无限的限制，以纠正这一点。

## 一句声明

```JAVA
$Statement$;

```

通过将出现次数增加到特定数量，您可以找到包含最多指定数量元素的语句序列。

## 方法调用

```JAVA
$Instance$.$MethodCall$($Parameter$)

```

此模板匹配方法调用表达式。 如果出现次数为零，这意味着可以省略方法调用。

```JAVA
@Deprecated
$Instance$.$MethodCall$($Parameter$)

```

您可以使用此模板查找已弃用的方法，并将其用作创建其他已注解方法模板的原型。 专门用于查找对已废弃方法的方法调用，您可以选择现有的模板   对弃用方法的调用  。

如需了解有关创建搜索模板的更多信息，请参阅 [结构化搜索和替换](structural-search-and-replace.html)。

## If 语句

```JAVA
if ($Expr$) {
    $ThenStatements$;
}
else {
    $ElseStatements$;
}
        
```

## 在注释和字符串字面量中搜索

假设要查找包含 'foo' 的注释或文字。 搜索模板将类似于  `$SomethingWeWantToFind$`  或  `"$SomethingWeWantToFind$"` 。 如果您想查找包含某些特定单词（例如，foo 作为一个单词）的注释或字符串，应将其指定为文本约束条件。

## 添加 try/catch/finally 代码

如果希望用  `try/catch/finally` 结构替换一条语句，可以建议使用以下一对搜索和替换模板。 搜索模板为：

```JAVA
$Statements$;

```

指定一定的最大出现次数作为约束。

替换模板为：

```JAVA
try {
 $Statements$;
}
catch(Exception ex) {
}

```

## 查找某个类的所有子类或实现某个接口的所有类

请考虑以下搜索模板：

```JAVA
class $Clazz$ extends $AnotherClass$ {}

```

或

```JAVA
class $Clazz$ implements $SomeInterface$ {}

```

作为 $AnotherClass$ 或 $SomeInterface$ 的变量文本约束，请指定基类或实现的接口的名称。

## 查找所有此类方法

要查找同一接口方法的不同实现，请使用以下搜索模板：

```JAVA
class $a$ {
public void $show$();
}

```

为变量  `$show$`  指定文本约束，并启用选项   这个变量是搜索的目标  。

## 使用 @Modifier 查找包本地和实例方法

IntelliJ IDEA 为类的  package local  和  instance  字段提供了预定义模板。 这些模板使用了  @Modifier 注解，当无法用自然语言表达搜索目标时，这个注解有助于描述搜索目标。

但是，如果您需要搜索包本地或实例方法，您将必须自行创建相应的搜索模板，并应用  @Modifier  注解。

要指定查找所有具有  package local  和  instance  可见性修饰符的方法的条件，请使用以下搜索模板：

```JAVA
class
$Class$ {
@Modifier("packageLocal") @Modifier("Instance" ) $ReturnType$ $MethodName$($ParameterType$ $Parameter$);
}
}

```

## 在搜索中使用“Contained in Constraints”字段

现有示例使用以下模板：

```JAVA
LOG.debug($params$);

```

将  `if('_a) { '_st*; }`  放置在  `_a`  和  `_st`  是变量且  `*`  表示在   包含在约束中   字段中零次或多次出现时，并选择   反转条件   复选框的   完全匹配   变量，将会搜索不包含在  `if`  语句中的日志语句。

## HTML 和 XML 示例

以下示例展示了如何在 HTML 和 XML 代码中使用结构搜索。

Procedure: 搜索 XML 和 HTML 标签、属性及其值

搜索标签的最简单模板是  `<$tag$/>` 。

1. 通过对变量  `$tag$`  施加约束，您可以指定要查找的标签。 例如，如果您指定  `li` ，您将获得所有  `li`  标签。

2. 请考虑以下用于在 XML 和 HTML 中搜索的模板：  `<$tag$ $attribute$=$value$ />` 。 例如，如果您为  `id` 变量指定文本过滤器  `$attribute$` 和作为  `$value$` 变量文本过滤器的正则表达式  `\d+` ，您可以在  `id` 属性中找到所有具有数值的标签。

Procedure: 删除所有 id 属性大于 2 的行

1. 创建一个 HTML 文件并粘贴以下代码：

```HTML
<!doctype html>
                    <html>
                    <head><link rel="canonical" href="https://www.jetbrains.com/zh-cn/help/idea/structural-search-and-replace-examples.html.md/" data-react-helmet="true"/>
                        <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>
```

2. 在主菜单中，前往  `编辑 | 查找 | 结构化搜索` 。

3. 从   语言   列表中选择   HTML  。

4. 将以下字符串粘贴到   搜索模板   字段：

```
<$tag$ $attribute$="$value$">
```

5. 点击  `$tag$`  变量。

6. 在筛选器面板中，点击   添加修饰符  ，选择   文本  ，并在值字段中输入  `li` 。

如果筛选器面板不可见，请点击 ![](https://resources.jetbrains.com/help/img/idea/2026.3/app-client.expui.general.filter.svg)   切换修饰符面板  。

![切换过滤面板](https://resources.jetbrains.com/help/img/idea/2026.3/toggle_filter_panel.png)

7. 点击  `$attribute$`  变量。

8. 在筛选器面板中，点击   添加修饰符  ，选择   文本  ，并在值字段中输入  `id` 。

9. 点击  `$value$`  变量。

10. 在筛选器面板中，点击   添加修饰符  ，选择   文本  ，并在值字段中输入  `\d+` 。

`\d+`  正则表达式将搜索结果限制为数值。 因此，包含  `id="a"` 的行将被过滤。

11. 在不切换焦点的情况下，从过滤器面板中，点击   添加  按钮，选择   脚本  并粘贴以下代码：

```GROOVY
value.getText().replaceAll (/"/, '').toInteger() > 2
```

脚本读取  `$value$`  变量的内容，并将其作为字符串返回（例如，  `"1"` ）。 然后该脚本替换所有的引号并将字符串值转换为整数，并与  `2` 进行比较。

![删除 id 大于 2 的行](https://resources.jetbrains.com/help/img/idea/2026.3/structural_replace_delete_ids_greater_than_2.png)

> **Note:**
> 若要在不同选择范围之间切换，请从   目标  列表中选择所需的值。 例如，要选择符合模板的整行，请选择   完全匹配  。

Procedure: 将 li 标签中 class 属性的值从大写转换为小写

1. 创建一个 HTML 文件并粘贴以下代码：

```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>

```

2. 在主菜单中，前往  `编辑 | 查找 | 结构性替换` 。

3. 从   语言   列表中选择   HTML  。

4. 将以下字符串粘贴到   搜索模板   字段：

```
<$tag$ $attribute$="$value$">
```

5. 请选择   区分大小写   复选框。

6. 点击  `$tag$`  变量。

7. 在筛选器面板中，点击   添加修饰符  ，选择   文本  ，并在值字段中输入  `li` 。

8. 点击  `$attribute$`  变量。

9. 在筛选器面板中，点击   添加修饰符  ，选择   文本  ，并在值字段中输入  `class` 。

10. 点击  `$value$`  变量。

11. 在筛选器面板中，点击   添加修饰符  ，选择   文本  ，并在值字段中输入  `[A-Z].*` 。

`[A-Z].*`  正则表达式将搜索结果限制为大写值。

> **Note:**
> 有时可能需要使用内联标志。 在这种情况下，正则表达式将如下所示：  `(?-i)\b[A-Z]+\b` 。  `(?-i)`  确保关闭区分大小写模式。

12. 从   目标   列表中选择   value  。 此过程会高亮显示  `class`  特性的所有大写值。

13. 在   替换模板   字段中，粘贴  `$to_lower_case$`  变量。

14. 点击  `$to_lower_case$`  变量。

15. 在筛选面板中，点击   添加修饰符  ，选择   脚本  并粘贴以下代码：

```GROOVY
value.getText().toLowerCase()
```

![替换一个目标结构](https://resources.jetbrains.com/help/img/idea/2026.3/replace_target_structurally.png)

16. 点击   查找  。

17. 在   查找  工具窗口中，预览找到的结果并点击   全部替换  。

![find.replace.all.action](https://resources.jetbrains.com/help/img/idea/2026.3/find_replace_all_action.png)

## See also

### 过程

[结构化搜索和替换](structural-search-and-replace.html)

