13

在我项目的所有 java 文件中,我想替换出现的情况:

myObject.getName() == null

接着就,随即:

myObject.hasName()

IntelliJ IDEA 是否有任何行动或策略来做到这一点?

  • 我希望它特定getName我的类的方法,MyClass而不是替换代码,它指getName的是其他类调用的方法。
  • 我希望它找到尽可能的匹配项。它不应该关心额外的空格、换行符等。如果变量有另一个名称(如myObjor objX)它也应该工作。getObject().getName()也应该找到类似的调用。(搜索必须关心语义)。
  • 我希望它很快,而不是要求我一一经历数百场比赛。
4

4 回答 4

12

使用结构搜索和替换(编辑|查找|结构替换...),它是为这样的用例而设计的。

使用搜索模板:

$x$.getName() == null

替换模板:

$x$.hasName()

单击编辑变量...按钮并将表达式类型 (regexp)指定为MyClass。搜索时也会找到您的示例getObject().getName() == null

于 2017-04-20T21:14:49.587 回答
6

使用查找和替换代码重复项

  1. 创建实例方法:

    public boolean hasName() {
        return getName() == null;
    }
    
    • 为此,我建议选择myObject.getName() == null,然后使用操作Refactor | 提取物 | 方法...重构 | 移动...,因此您不必输入任何代码。
  2. 单击方法并使用Refactor | 查找和替换代码重复

    • 但是它不会重构这样的用法:

      String name = myObject.getName();
      if (name == null) {
          ...
      }
      
    • 您还可以在非实例方法上使用此操作:

      private boolean hasName(MyClass myObject) {
          return myObject.getName() == null;
      }
      

      这将导致方法静态,然后使用Refactor | 转换为实例方法。结果相同。

于 2017-04-20T20:31:30.250 回答
2

您可以重命名getName()为类似的名称putGuidInHereIfYouWantToBeSure(),然后使用 with 在所有文件中进行简单putGuidInHereIfYouWantToBeSure() == null替换hasName()

于 2017-04-25T08:48:33.930 回答
-1

来自IntelliJ 文档


替换指定路径内所有文件中的一段文本

  1. 执行以下操作之一:
    • 在主菜单上,选择编辑 | 查找 | 在路径中替换
    • Ctrl+Shift+R
    • Find In Path对话框中,按Ctrl+Shift+R切换到Replace In Path对话框。
  2. 在“替换路径”对话框中,指定搜索和替换字符串、搜索选项和范围。明确键入搜索和替换文本,或使用正则表达式指定模式,或从最近历史记录下拉列表中选择以前使用的一段文本或模式。
    • 如果您通过正则表达式指定搜索和/或替换文本,请使用$n反向引用中的格式(以引用先前找到并保存的模式)。
    • \在正则表达式中使用反斜杠字符,请通过在介词中插入三个额外的反斜杠\\\\来转义有意义的反斜杠: .
  3. 单击查找窗口中的替换IntelliJ IDEA 在“查找”工具窗口中显示遇到的搜索字符串,选择第一个匹配项并在编辑器中打开包含该匹配项的文件并将焦点移至该文件。
    同时,IntelliJ IDEA 会打开Replace Usage对话框,在标题栏中显示遇到的事件的完整路径: 在此处输入图像描述 执行以下操作之一:
    • 要替换选定的匹配项,请单击替换
    • 要保留选定的事件并移至下一个事件,请单击跳过
    • 要替换当前活动选项卡中出现的所有搜索字符串,请单击Replace All in This File
    • 要保留当前活动选项卡(任意)中出现的搜索字符串并移至下一个文件,请单击Skip to Next File
    • 要替换所有检测到的事件,请单击所有文件
    • 要切换到手动模式,请单击预览Replace Usage对话框关闭,焦点移至Find工具窗口。执行以下操作之一:
      • 浏览检测到的事件列表,选择要替换的事件,然后单击Replace Selected
      • 要更改所有匹配项,请单击全部替换
于 2017-04-18T12:54:01.570 回答