# 使用结构化搜索和替换

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

结构化搜索和替换是一种强大的工具，可以搜索特定的代码模式并添加修饰符以缩小搜索范围。

在本教程中，我们将搜索字段声明，添加修饰符，并基于修改后的模板创建代码检查。 如果您愿意，您可以在我们深入探讨之前观看相关视频。 视频可能会略有不同，因为这是为较早版本的 IntelliJ IDEA 制作的。

[Video](https://www.youtube.com/v/fIPr_ANBpFk)

让我们打开   结构化搜索  对话框，并使用一个现有模板进行搜索。

Procedure: 使用现有模板（字段声明）

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

2. 在   结构搜索  对话框中，在  `Java | 基于类` 节点下，选择   类的所有字段  ，这将查找所有字段声明并点击   查找  。

![现有模板对话框](https://resources.jetbrains.com/help/img/idea/2026.3/all_fields_of_a_class.png)

因此，在   查找  工具窗口中，IntelliJ IDEA 会显示我们 Java 代码中声明的所有字段。

![查找工具窗口：搜索结果](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_result_find.png)

现在，让我们回到结构搜索对话框来稍微修改一下预定义模板。 顺便说一句，您可以使用   随处搜索   窗口来访问搜索对话框。

Procedure: 更改预定义模板

1. 请按 `Shift` (Windows), `Shift` (macOS), `Shift` (IntelliJ IDEA Classic (macOS)), `Shift` (macOS System Shortcuts), `Shift` (XWin), `Shift` (GNOME), `Shift` (KDE), `Shift` (Emacs), `Shift` (Sublime Text), `Shift` (Sublime Text (macOS)), `Shift` (Visual Studio), `Shift` (Visual Studio (macOS)), `Shift` (NetBeans), `Shift` (Eclipse), `Shift` (Eclipse (macOS)) 两次以打开   随处搜索   窗口。

2. 开始输入搜索查询，点击搜索结果列表中的   结构化搜索   以打开我们的结构化搜索对话框。

![全局搜索窗口](https://resources.jetbrains.com/help/img/idea/2026.3/search_everywhere_ssr.png)

3. 在   结构搜索  对话框中，我们通过在  `final` 变量之前添加  `$Field$` 来更新模板，只搜索最终字段。 请注意，对话框中支持代码补全。

![结构化搜索对话框中的代码补全](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_code_completion.png)

4. 我们将递归地搜索我们的代码，匹配大小写，并且只在 Java 类型文件中搜索。

![结构搜索对话框：缩小搜索范围](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_search_checkboxes.png)

5. 当我们更改范围时，IntelliJ IDEA 可以立即通知您在指定范围内是否可以找到代码模式。

![结构搜索对话框：模块范围](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_no_match_in_scope.png)

6. 在   查找   工具窗口中检查结果。

![查找工具窗口：最终字段搜索结果](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_final_field_result.png)

通过结构搜索，我们可以进行一些有趣的搜索。 让我们选择另一个现有模板(   方法调用  )作为我们的例子。

Procedure: 使用现有的模板（方法调用）

1. 在   结构搜索  对话框中，点击 ![工具图标](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.settings.svg)并选择   现有模板  。

2. 打开现有模板列表，然后在   方法调用   节点下选择   表达式   模板。

![现有模板对话框：方法调用](https://resources.jetbrains.com/help/img/idea/2026.3/method_calls_template.png)

3. 如果我们现在运行搜索，我们的代码中的所有方法调用都会出现在结果中。 因此，我们应当稍微修改我们的模板并使用修饰符，以便更具体地说明我们在寻找什么。 让我们添加一个修饰符  `文本`  并定义一个名为  `打印` 的方法。 我们会查找调用一个名为  `打印` 的方法。

4. 我们可以添加一个正则表达式，例如，查找所有包含  `打印`  的方法调用。 为此，让我们切换  `打印`  到  `print.*` 。

现在搜索结果不仅会包括 print，还会包括  `打印行`  和  `printf` 。

5. 让我们更改搜索模式，以便结果只显示仅接受单个参数的方法。 点击  `$Parameter$` 变量并添加计数修饰符  `min=1`   `max=1` 。

![为参数添加计数修饰符](https://resources.jetbrains.com/help/img/idea/2026.3/parameter_filter.png) 在这种情况下，我们的搜索结果会更少。

假设我们正在进行此搜索，以用日志调用替换所有这些方法调用，而不是  `System.out` 。 这些日志方法只接受字符串类型，不接受其他类型。

首先，让我们找出传递字符串的方法。

Procedure:

1. 在   结构搜索  对话框中，为  `$Parameter$` 变量添加修饰符   类型  。

![添加类型修饰符字符串](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_param_string.png)

2. 点击   搜索  。 因此，我们看到了一系列只接受文字字符串或类型为  `字符串`  的变量的 print 方法。

![“查找”工具窗口：结果](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_result_param_string.png)

现在让我们进行替换。

Procedure: 替换代码

1. 请使用   随处搜索   窗口访问   结构替换  。

2. 在   结构替换  对话框中，在   替换模板  中添加您想要用来替换搜索结果的代码。 在我们的情形中是  `java.util.logging.Logger.getLogger(this.getClass().getName()).fine($Parameter$)`

![“结构替换”对话框：替换模式](https://resources.jetbrains.com/help/img/idea/2026.3/replace_pattern.png)

点击   查找  。

3. 请在   查找   工具窗口中检查结果，并使用替换选项替换所有结果或仅替换选定的结果。

![Find 工具窗口：替换结果](https://resources.jetbrains.com/help/img/idea/2026.3/find_tool_window_replace.png)

正如您所见，代码已被更改。

![替换结果](https://resources.jetbrains.com/help/img/idea/2026.3/replace_results.png)

我们可以保存此模板以备日后需要时参考。

Procedure: 保存已修改的模板

1. 在   结构替换  对话框中，点击 ![工具](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.settings.svg)。

2. 在打开的列表中，选择   保存模板  。

3. 让我们添加模板的名称 (   打印 String 调用  ) 并点击   OK  。

模板保存在   用户定义   节点下的   现有模板   对话框中。

![保存的模板](https://resources.jetbrains.com/help/img/idea/2026.3/saved_template.png)

在   结构替换  对话框中，我们可以点击 ![搜索图标](https://resources.jetbrains.com/help/img/idea/2026.3/app.actions.search.svg)来查看您最近搜索的历史记录，并快速重新运行其中的任何一条。

![最近条目](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_recent_search.png)

我们还可以将模板用作检查，因此当我们遇到相同代码时，会看到一个警告，并可以快速替换代码。

Procedure: 创建自定义检查

1. 在   查找  工具窗口中，当您获得替换模式的结果时，点击   从模板创建检查  。

2. 在打开的对话框中，添加模板的名称  `打印 String 调用` 。

![结构搜索检查对话框](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_inspection_dialog.png) 如果您愿意，您可以添加工具提示并点击   OK  。

3. 在   设置   对话框（ `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS))）中，转到  `编辑器 | 检查` 。

4. 在   检查  页面上，打开   结构化搜索  节点以定位创建的检查。

![检查设置：结构搜索检查](https://resources.jetbrains.com/help/img/idea/2026.3/inspections_page_ssr_inspection.png)

现在，您可以在编辑器中快速修复代码，或者使用   问题  视图，在那里我们可以检查带有使用新代码替换的建议的警告。

![问题视图](https://resources.jetbrains.com/help/img/idea/2026.3/problems_tool_window_replace.png)

我们可以直接从检查设置中添加自定义结构搜索检查。

Procedure: 从检查 设置中创建自定义检查

1. 在   设置   对话框（ `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS))）中，转到  `编辑器 | 检查` 。

2. 在   检查  页面，选择   结构化搜索  节点并点击 ![添加结构化搜索替换检查](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.add.svg)。 我们可以基于搜索模板或替换模板进行检查。 让我们选择   添加替换模板  。

3. 在   结构替换   对话框中，让我们稍微更改一下搜索模式。 让我们将  `类型`  修饰符更改为  `int`  以便我们的  `$Parameter$`  变量。

4. 在替换模式中，让我们调整代码。  `java.util.logging.Logger.getLogger(this.getClass().getName()).fine(String.valueOf($Parameter$))`

![更改模式](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_change_to_int_pattern.png)

5. 在打开的对话框中，让我们添加检查的名称  `打印 int 调用`  并点击   OK  。

![检查名称](https://resources.jetbrains.com/help/img/idea/2026.3/print_int_calls.png)

新的检查项被添加到   结构化搜索   下，您可以运行它来搜索打印整数的实例。 当找到这样的代码时，我们可以用记录器调用来替换它，并将找到的参数转换成字符串。

我们可以使用其名称单独运行我们的检查。

Procedure: 运行结构搜索检查

1. 按 `Ctrl+Alt+Shift+I` (Windows), `⌘ ⌥ ⇧ I` (macOS), `⌘ ⌥ ⇧ I` (IntelliJ IDEA Classic (macOS)), `⌘ ⌥ ⇧ I` (macOS System Shortcuts), `Ctrl+Alt+Shift+I` (XWin), `Ctrl+Alt+Shift+I` (GNOME), `Ctrl+Alt+Shift+I` (KDE), `Ctrl+Alt+Shift+I` (Emacs), `Ctrl+Alt+Shift+I` (Sublime Text), `⌘ ⌥ ⇧ I` (Sublime Text (macOS)), `Ctrl+Alt+Shift+I` (Visual Studio), `⌘ ⌥ ⇧ I` (Visual Studio (macOS)), `Ctrl+Alt+Shift+I` (NetBeans), `Ctrl+Alt+Shift+I` (Eclipse), `⌘ ⌥ ⇧ I` (Eclipse (macOS)) 或在主菜单中转到  `代码 | 分析代码 | 按名称运行检查…` 。

2. 在打开的对话框中，我们输入检查的名称  `打印 String 调用` 。

![输入检查名称](https://resources.jetbrains.com/help/img/idea/2026.3/inspection_name.png)

3. 在   运行 'print String calls'  对话框中，让我们保留默认选项并点击   OK  。

![检查作用域](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_inspection_scope.png)

4. 我们可以在   检查结果   工具窗口中查看我们的结果。

![检查结果](https://resources.jetbrains.com/help/img/idea/2026.3/ssr_inspection_results.png)

