IntelliJ IDEA 2025.1 Help

结构化搜索和替换示例

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

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

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

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

示例模式

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

  • 作为块语句

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

    class ClassA { public synchronized void someMethod() { // ... } }

让我们找找类似的东西

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

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

一句声明

$Statement$;

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

方法调用

$Instance$.$MethodCall$($Parameter$)

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

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

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

如需了解有关创建搜索模板的更多信息,请参阅 结构化搜索和替换

If 语句

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 为类的 package localinstance 字段提供了预定义模板。 这些模板使用了 @Modifier注解,当无法用自然语言表达搜索目标时,这个注解有助于描述搜索目标。

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

要指定查找所有具有 package localinstance 可见性修饰符的方法的条件,请使用以下搜索模板:

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

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

现有示例使用以下模板:

LOG.debug($params$);

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

HTML 和 XML 示例

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

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

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

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

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

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

  1. 创建一个 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>
  2. 在主菜单中,前往 编辑 | 查找 | 结构化搜索

  3. 语言(L) 列表中选择 HTML 文件

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

    <$tag$ $attribute$="$value$">
  5. 请点击 $tag$ 变量。

  6. 在筛选面板中,点击 添加修饰符 ,选择 文本 并在数值字段中键入 li

    如果过滤面板不可见,请点击 切换修饰符面板

    切换过滤面板
  7. 请点击 $attribute$ 变量。

  8. 在筛选面板中,点击 添加修饰符 ,选择 文本 并在数值字段中键入 id

  9. 请点击 $value$ 变量。

  10. 在筛选面板中,点击 添加修饰符 ,选择 文本 并在数值字段中键入 \d+

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

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

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

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

    删除 id 大于 2 的行

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

  1. 创建一个 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. 语言(L) 列表中选择 HTML 文件

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

    <$tag$ $attribute$="$value$">
  5. 请选择 区分大小写(C) 复选框。

  6. 请点击 $tag$ 变量。

  7. 在筛选面板中,点击 添加修饰符 ,选择 文本 并在数值字段中键入 li

  8. 请点击 $attribute$ 变量。

  9. 在筛选面板中,点击 添加修饰符 ,选择 文本 并在数值字段中键入 class

  10. 请点击 $value$ 变量。

  11. 在筛选面板中,点击 添加修饰符 ,选择 文本 并在数值字段中键入 [A-Z].*

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

  12. 目标(T) 列表中选择 。 此过程将突出显示 class 属性的所有大写值。

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

  14. 请点击 $to_lower_case$ 变量。

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

    value.getText().toLowerCase()
    替换一个目标结构
  16. 点击 查找

  17. 查找 工具窗口中,预览找到的结果并点击 全部替换(A)

    find.replace.all.action
最后修改日期: 2025年 4月 24日