结构搜索和替换示例
最后修改时间:2023 年 9 月 8 日如您所知,常规搜索和结构搜索之间的主要区别在于,在结构搜索中,我们正在寻找编程语言中的结构模板。
结构搜索的优点在于,您可以基于现有模板创建模式,并在搜索和替换代码时节省时间。
现有模板的广泛列表涵盖了从简单模式到更复杂模式的许多用例。
模式中的每个项目都由两侧由 $ 符号限制的变量组成。
示例模式
让我们从一个简单的任务开始,使用synchronized
关键字搜索打开的锁对象。关键字synchronized
可以有两种情况:
作为块语句
class ClassA { public void someMethod() { synchronized(this) { // ... } } }
作为方法修饰符
class ClassA { public synchronized void someMethod() { // ... } }
让我们寻找类似的东西
synchronized ($parameter$){
$statement$;
}
我们可以为 $parameter$ 变量添加 Count 修饰符,从 0 到无穷大。因此,该模式可以搜索具有任意数量参数的所有可同步方法,但主体中只有一行代码。我们还为 $statement$ 变量设置了相同的零到无穷大限制,以纠正此问题。
一份声明
$Statement$;
将出现次数计数增加到一定数量,您可以找到最多包含指定数量元素的语句序列。
方法调用
$Instance$.$MethodCall$($Parameter$)
该模板匹配方法调用表达式。如果出现次数为零,则意味着可以省略方法调用。
@Deprecated
$Instance$.$MethodCall$($Parameter$)
您可以使用此模板查找已弃用的方法,并将其用作创建其他带注释的方法模板的原型。特别是为了搜索对已弃用方法的方法调用,您可以选择已存在的对已弃用方法的模板方法调用。
有关创建搜索模板的更多信息,请参阅结构搜索和替换。
如果语句
if ($Expr$) {
$ThenStatements$;
}
else {
$ElseStatements$;
}
在注释和字符串文字中搜索
假设有人想要查找包含“foo”的注释或文字。搜索模板将类似于$SomethingWeWantToFind$
或"$SomethingWeWantToFind$"
。如果想要查找包含某些特定单词(例如,foo 作为单词)的注释/字符串,则应将其指定为文本约束。
添加 try/catch/finally 代码
如果想要用try/catch/finally
构造替换语句,可以建议使用以下一对搜索和替换模板。搜索模板是:
$Statements$;
将某个最大出现次数指定为约束。
替换模板为:
try {
$Statements$;
}
catch(Exception ex) {
}
查找某个类的所有后代或实现某个接口的所有类
考虑以下搜索模板:
class $Clazz$ extends $AnotherClass$ {}
或者
class $Clazz$ implements $SomeInterface$ {}
作为变量 $AnotherClass$ 或 $SomeInterface$ 的文本约束,指定基类或实现的接口的名称。
查找所有此类方法
要查找同一接口方法的不同实现,请使用以下搜索模板:
class $a$ {
public void $show$();
}
为$show$
变量指定文本约束,并启用选项此变量是搜索的目标。
使用 @Modifier 查找包本地方法和实例方法
IntelliJ IDEA 建议为类的包本地字段和实例字段提供预定义模板。这些模板使用@Modifier注释,当无法使用自然语言手段表达搜索目标时,这有助于描述搜索目标。
但是,如果您需要搜索包本地或实例方法,则必须自己创建相应的搜索模板,并应用@Modifier注释。
要指定查找具有可见性修饰符包 local和instance的所有方法的条件,请使用以下搜索模板:
class
$Class$ {
@Modifier("packageLocal") @Modifier("Instance" ) $ReturnType$ $MethodName$($ParameterType$ $Parameter$);
}
}
在搜索中使用“包含在约束中”字段
现有示例使用以下模板:
LOG.debug($params$);
if('_a) { '_st*; }
将where_a
和are 变量放置在Contained in Constraints字段中_st
并*
表示零次或多次出现,并选择Complete Match变量的反转条件复选框将导致搜索未包含在语句中的日志记录语句。if
HTML 和 XML 示例
以下示例展示了如何在 HTML 和 XML 代码中使用结构搜索。
搜索 XML 和 HTML 标签、属性及其值
搜索标签的最简单模板是<$tag$/>
。
通过对变量设置约束
$tag$
,您可以指定要查找的标签。例如,如果您指定li
,您将获得所有li
标签。请考虑以下用于在 XML 和 HTML 中搜索的模板:
<$tag$ $attribute$=$value$ />
。例如,如果您指定变量id
的文本过滤器$attribute$
,并\d+
指定正则表达式作为变量的文本过滤器$value$
,则可以找到属性中具有数值的所有标签id
。
删除所有id属性大于2的行
创建一个 HTML 文件并粘贴以下代码:
HTML code
{...}转到编辑 | 查找| 结构性搜索。
从语言列表中,选择HTML。
将以下字符串粘贴到搜索模板字段:
<$tag$ $attribute$="$value$">
单击该
$tag$
变量。在过滤器面板中,单击添加修饰符,选择文本
li
并在值字段中键入。如果过滤器面板不可见,请单击“切换修改器面板”图标。
单击该
$attribute$
变量。在过滤器面板中,单击添加修饰符,选择文本
id
并在值字段中键入。单击该
$value$
变量。在过滤器面板中,单击添加修饰符,选择文本
\d+
并在值字段中键入。正
\d+
则表达式将搜索结果限制为数值。因此,带有 的行将id="a"
被过滤掉。在不从过滤器面板切换焦点的情况下,单击“添加”按钮,选择“脚本”并粘贴以下代码:
value.getText().replaceAll (/"/, '').toInteger() > 2
该脚本读取变量的内容
$value$
并将其作为字符串返回(例如,"1"
)。然后脚本替换所有引号并将字符串值转换为整数并与 进行比较2
。
笔记
要在不同选择范围之间切换,请从“目标”列表中选择必要的值。例如,要选择与模板匹配的整行,请选择完全匹配。
将 li 标签中的 class 属性的大写值转换为小写
创建一个 HTML 文件并粘贴以下代码:
HTML code
{...}转到编辑 | 查找| 结构上替换。
从语言列表中,选择HTML。
将以下字符串粘贴到搜索模板字段:
<$tag$ $attribute$="$value$">
选择匹配大小写复选框。
单击该
$tag$
变量。在过滤器面板中,单击添加修饰符,选择文本
li
并在值字段中键入。单击该
$attribute$
变量。在过滤器面板中,单击添加修饰符,选择文本
class
并在值字段中键入。单击该
$value$
变量。在过滤器面板中,单击添加修饰符,选择文本
[A-Z].*
并在值字段中键入。正
[A-Z].*
则表达式将搜索结果限制为大写值。从“目标”列表中,选择“值”。此过程突出显示属性的所有大写值
class
。在替换模板字段中,粘贴
$to_lower_case$
变量。单击该
$to_lower_case$
变量。在过滤器面板中,单击“添加修饰符”,选择“脚本”并粘贴以下代码:
value.getText().toLowerCase()
单击“查找”。
在“查找”工具窗口中,预览找到的结果并单击“全部替换”。
感谢您的反馈意见!