使用结构搜索和替换
最后修改时间:2023 年 9 月 7 日结构搜索和替换是一个功能强大的工具,可以搜索特定的代码模式并添加修饰符来缩小搜索范围。
在本教程中,我们将搜索字段声明,添加修饰符,并根据修改后的模板创建代码检查。如果您愿意,可以在我们深入讨论之前观看相关视频。该视频可能略有不同,因为它是为早期版本的 IntelliJ IDEA 制作的。
让我们打开“搜索结构”对话框并使用现有模板之一进行搜索。
使用现有模板(字段声明)
转到编辑 | 查找| 结构性搜索。
在“结构搜索”对话框中的Java |下 基于类的节点,选择“类的所有字段”,这将查找所有字段声明,然后单击“查找”。
因此,在“查找”工具窗口中,IntelliJ IDEA 显示了 Java 代码中声明的所有字段。
现在,让我们返回到结构搜索对话框来稍微更改一下预定义的模板。顺便说一句,我们可以使用“Search Everywhere”窗口来访问搜索对话框。
更改预定义模板
按两次可打开“搜索无处不在”窗口。Shift
开始输入搜索查询,单击搜索结果列表中的“结构搜索”以打开我们的结构搜索对话框。
在“结构搜索”对话框中,我们通过在变量
final
之前添加来更新模板以仅搜索最终字段$Field$
。请注意,对话框中支持代码完成。我们将递归搜索代码,匹配大小写,并仅在 Java 类型文件中搜索。
当我们更改范围时,IntelliJ IDEA 可以立即通知您是否可以在指定范围内找到该 Code Pattern。
在“查找”工具窗口中检查结果。
通过结构搜索,我们可以进行一些有趣的搜索。让我们选择另一个现有模板(方法调用)作为我们的示例。
使用现有模板(方法调用)
在“结构搜索”对话框中,单击并选择“现有模板”。
打开现有模板的列表,然后选择“表达式”节点下的方法调用模板。
如果我们现在运行搜索,我们最终会得到包含代码中所有方法调用的结果。因此,我们应该稍微改变我们的模板并使用修饰符来更具体地表达我们正在寻找的内容。让我们添加一个修饰符
Text
并定义一个名为 的方法print
。我们将寻找对名为 的方法的调用print
。我们可以添加一个正则表达式,例如查找所有对包含
print
. 为此,我们切换print
到print.*
.现在我们的搜索结果不仅包括 print,还
println
包括 和printf
。让我们更改搜索模式,以便结果仅显示仅采用单个参数的方法。单击
$Parameter$
变量并添加计数修饰符min=1
max=1
。在这种情况下,我们的搜索结果将会减少。
假设我们正在进行此搜索,以将所有这些方法调用替换为日志记录调用而不是System.out
. 日志记录方法仅采用字符串,不采用其他类型。
首先,让我们找到传递字符串的方法。
在“结构搜索”对话框中,为变量添加修饰符“类型”
$Parameter$
。单击“搜索”。结果,我们看到了仅接受文字字符串或类型变量的打印方法列表
String
。
现在让我们进行替换。
替换代码
使用Search Everywhere窗口访问Structural Replace。
在替换模板的结构替换对话框中,添加您想要替换搜索结果的代码。在我们的例子中是
java.util.logging.Logger.getLogger(this.getClass().getName()).fine($Parameter$)
单击“查找”。
检查“查找”工具窗口中的结果,并使用替换选项替换所有结果或仅替换选定的结果。
如您所见,代码已更改。
我们可以保存此模板以供以后需要时参考。
保存修改后的模板
在“结构替换”对话框中,单击。
在打开的列表中,选择“保存模板”。
让我们添加模板的名称(打印字符串调用)并单击“确定”。
该模板保存在“现有模板”对话框中的“用户定义”节点下。
在“结构替换”对话框中,我们可以单击以查看最近搜索的历史记录并快速重新运行其中的任何搜索。
我们还可以使用我们的模板作为检查,因此当我们遇到相同的代码时,我们会看到警告并可以快速替换代码。
创建自定义检查
在“查找”工具窗口中,当您获得替换模式的结果时,单击“从模板创建检查”。
在打开的对话框中,让我们添加模板的名称
print String calls
。如果需要,您可以添加工具提示并单击“确定”。
在“设置”对话框 ( ) 中,转到编辑器 | 检查。CtrlAlt0S
在“检查”页面上,打开“结构搜索”节点以找到创建的检查。
现在,我们可以在编辑器中快速修复代码,或者使用“问题”视图,在其中我们可以检查警告并建议将其替换为新代码。
我们可以直接从检查设置添加自定义结构搜索检查。
从检查设置创建自定义检查
在“设置”对话框 ( ) 中,转到编辑器 | 检查。CtrlAlt0S
在“检查”页面上,选择“结构搜索”节点并单击。我们可以基于搜索模板或替换模板进行检查。让我们选择添加替换模板。
在“结构替换”对话框中,我们稍微更改一下搜索模式。让我们将变量
Type
的修饰符更改为。$Parameter$
int
在替换模式中,让我们调整我们的代码。
java.util.logging.Logger.getLogger(this.getClass().getName()).fine(String.valueOf($Parameter$))
在打开的对话框中,添加检查的名称
print int calls
,然后单击“确定”。新的检查添加在结构搜索下,我们可以运行它来搜索打印整数的实例。当找到这样的代码时,我们可以用记录器调用替换它,并将找到的参数转换为字符串。
我们可以使用它的名称单独运行我们的检查。
运行结构搜索检查
转到代码| 分析代码 | 按名称运行检查... ( )。CtrlAltShift0I
在打开的对话框中,输入检查的名称
print String calls
。在“运行‘打印字符串调用’”对话框中,保留默认选项并单击“确定”。
我们可以在检查结果工具窗口中查看结果。
感谢您的反馈意见!