IntelliJ Idea Structural Replace 强大的结构化搜索和替换教程---以批量添加参数注解为例

 今天给大家介绍一下Idea中一个强大的替换功能-----结构化搜索和替换。在上篇博文说到的SpringCloud项目改造中,其中消费者对生产者的服务调用采用了Feign组件。使用Feign定义的声明式客户端接口,在方法的每个参数前需要加上@Param注解,并且@Param注解中还需要定义请求的参数名。

一开始接到这个任务的时候,想到的是能不能根据全局搜索替换(Replace In )解决。很显然,不能。当然,全局搜索也很有用处。此处顺带讲一下。Idea的全局搜索默认只显示100个搜索结果。如果想要展示全部结果的话,需要点击右下角的OPEN IN FIND WINDOW 按钮

 

除此之外,我们还想到说写一个工具根据正则表达式或代码结构来匹配参数。经过实践,这个方法不可行。正则无法匹配到每一种情况,比如参数类型多种多样、可能是有泛型声明、参数之间空格不定、以及文件中存在的各种换行及符号格式不同等等...无论怎么修改正则总无法完全匹配。而如果遗漏了某个接口的参数没有加上@Param注解,feign客户端的运行将会报错。

一开始排除了全局替换我就在想,万能的IDEA既然号称根据人体工程学设计的史上最伟大的JAVA 开发工具,有没有什么办法能根据参数的结构批量加上注解呢。后来终于在IDEA官网文档搜索到一个功能叫Structural  replace。大致看了下说明,觉得有可能可以解决我的这个需求。

我的Idea版本是

首先,我们点击Edit菜单,找到find,如红框所示就是结构化搜索和结构化替换功能Replace Structurally。

如果经常使用这个功能,可以给他定义一个快捷键

接下来可以看到这样一个界面

图中的Search template就是搜索模板。

Replace template是将要替换为的模板。

在EXISTING TEMPLATES处有idea预定义过的一些模板,(如果你修改了预定义模板并且按原名覆盖保存了,可以打开一个新的项目就能看到预定义模板)

对于Java模板,里面定义了这样一些分类的预定义模板

找到一个和你想要搜索替换最相近的模板,点击OK引入。然后可能需要经过一些改造以符合你的需求。

比如搜索方法调用。找到一个这样的模板

 

引入后点击Edit VARIABLES 可以对搜索和替换的目标进行一些限定

可以对Parameter这个变量进行一些限制,可以在Text/regexp后面输入文本或正则。

在Occrrences count处限制出现的最小个数和最大个数,两者同时生效。(Maximum那里,删除数字代表不限最大值)

如果勾选了底部的This variable is target of the search,那么代表用整个Replacement template替换的时候只替换这个变量,这个也很有用。后面我会讲到。

比如我写的给接口上的注解替换value值的模板为,

 

默认是Complete Match,代表完全替换搜索的模板。

参照系统预定义的一些模板,经过一番研究和测试,写了一个针对参数声明添加注解的模板

模板一

首先,变量是由一对美元符包裹的。每个模板的结尾如果不是以花括号或斜杠结尾(比如注释)时,如果提示模板有误,可以尝试在模板尾部加上分号,很重要。另外注解的变量在美元符前加@符号,如@$Annotation$( value="$orival$")

 

我定义了Parameter出现次数,最小最大次数都是1.完全匹配。

然后在scope中定义你要搜索的文件范围。

点击加号新建一个范围配置,然后在文件处选择相关模块的路径,每选择一个路径需要点击右侧的INCLUDE或INCLUDE RECURSIVELEY(递归包含).递归包含将包含它的子文件夹。添加进该配置,最后点击APPLY,OK。

保存好的范围配置在下拉箭头处,可以在所有类型的搜索中使用(比如普通的全局搜索替换)。

预定义的SCOPE包含所有地方、项目、项目和第三方依赖库、模块、当前文件、自定义范围等选项。

 如果匹配的文件超过1000个,会提示你是否继续搜索,点击是就完事了。

我以搜索当前文件为例,可以看到匹配了所有方法里的所有参数。搜索结果如图

 

 

点击Replace ALL按钮,将替换所有搜索结果。还可以在左侧点击只替换选中的(但是如果你选中了左上角的合并同一行的多处匹配,只会匹配每行第一个,注意),以及替换预览(预览可能不准)。

 

使用模板一有两个注意的地方,一是对于末尾为可变参数,例如 String... vars);这种状况,替换完成后会在变量名后多加一个分号为 String... vars;); 这个利用全局替换替换掉;);为);就好了

二是如果类中定义的有全局变量,或方法是有方法体的,方法中有声明局部变量时,这些地方的变量将一并加上注解。解决的方法是:针对全局变量,可以利用一个匹配全局变量的模板去除注解。而对于方法体中的变量,暂时没有方法只匹配方法体中的变量而排除方法声明中的变量。所以针对类,这个方法只能采取一种变通的方法。即加入一个间接层,间接层去调用实现类。在间接层的方法声明中加上注释,方法体中只调用方法实现类。这样就避免了这个问题。

不过针对接口来说,接口中最多也就只能有全局常量,(我们的FeignClient接口中还并没有常量);

这里把匹配类的全局变量模板告诉大家

Modifier注解只有少数可取值packageLocal和Instance,大家可以到Idea官网上查看帮助文档,官网文档这样写的。地址赋于文末。

利用这个方法去掉类成员变量上多添加的注解。不过我们的FeignClient是接口,同时没有常量,并不需要执行此步。

另一种方法是按照方法声明去匹配。但是那种方法经测试只能匹配固定参数的方法,而且value中必须先替换为带$ParamType$$Param$,替换完后再利用其它模板把$ParamType$去掉。麻烦之处在于有多少各参数,就分别要写多少个参数的模板。

例如给三个参数的方法添加注解模板为

模板二

如果在方法中参数个数定义为MIn为1,Max为unlimited,添加注解会出现修改错误的情况,所以不行,只能按照固定参数个数匹配去写。

因为最开始采用模板一时,没有在结尾加分号,导致模板提示语法错误,所以刚开始用的就是模板二这种方法。我们的项目中最多的参数一共有25参,所以我一共写了25个模板,坑爹啊!!

好在最后尝试了很多方法后找到了模板一。不用再用模板二这种坑爹的模板了。

这篇文章挺长的,那再把几个地方给大家介绍一下,更多操作比如批量引包、接口变类以及结合其他工具的操作放到下一篇文章或者看心情吧。需要结合自己写的工具来实现一些需求。不过总体来说,Idea的结构化替换时真的牛beer。

options下的选项分别有大小写敏感、文件类型(还有针对HTML、XML、JS及其他语言的)。框起来的三个选项是缩短全限定、重新格式化代码(如果你替换后或原本格式就很乱,换行不整齐,可以采用匹配整个类的模板,勾上此项后,每个方法都将被格式化,很实用)、和尽可能使用静态导入(比如替换引入了某个常量、枚举,使用静态导入)。看你需要勾选

框起来的地方分别有根据什么分组(文件结构、包、模块)、同一行多个匹配显示为一条记录、是否显示右侧预览可。把鼠标放上去悬浮会出现提示,就不细说了

结构化替换是真的强大,结合Replace in Path 全局替换更加完美,能够实现更多骚操作。比如将接口改成类、在类的每个方法体中加入log打印语句,不过这个需要结合自己写的工具微调一下替换结果。大家也可以自己下去研究,有更好的用法可以分享出来。

另外要说一句的是有些需求需要结合普通全局替换(Replace In Path)和自己编写的工具辅助配合,或者先经过一个模板结构化替换成某个样子,再利用另外一个模板完成替换,甚至多步。

比如将结构化替换到@RequestLine注解的value值的类名由驼峰转为斜线分割,这个结构化替换暂时不支持,需要自己写工具修改文件完成。具体步骤是这样

一、

 

此处需要点击EDIT VARIABELS中的targePlace选择$placeHolder$!!!

二、写一个工具将RequestLine注解中的接口类名改为斜线式分割

三、

四、

 

但是有了结构化替换,这一切将会变得更简单,你只需要搜索特定注解,这是很容易的,能减少很多原本需要靠自己花大量时间手写工具完成的工作。而有些需求靠写工具甚至无法完成的,比如在方法的形参声明前添加注解,这就必须采用结构化替换。

最后是我自己写的一些模板列表

Idea的结构化替换文档地址是https://www.jetbrains.com/help/idea/structural-search-and-replace-examples.html#14439fc6

官网给了许多简单的例子,但是要实现以上一些高度定制化的功能,需要自己花很多时间探索和尝试。有许多你以为正确的模板,替换出来的结果是不正确的,我觉得是Idea支持还不够百分百完美。比如我发现有时候不知道什么原因全部替换后会有几个类里的某个方法最后一个参数没有加上@Param注解导致报Body parameters cannot be used with form parameters,解决方法是针对这几个类单独去掉@Param注解再重新用结构化替换给它们加上,就又是正常的了。也有可能是我没有完全掌握正确的使用方式。希望这篇文章能帮助大家少走一些弯路。

直接百度Structural  Replace能看到官网文档,上面这个地址是2019.1版Idea的文档。新版的功能应该会更加完善。

觉得好用点个赞

 

https://info.flagcounter.com/cTMw
访客统计  https://info.flagcounter.com/cTMw
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: IntelliJ IDEA是一款强大的Java开发工具,其全局内容搜索替换功能非常方便实用。下面是详细的教程图解。 1.打开IntelliJ IDEA。点击菜单栏上的“Edit”选项,然后选择“Find”-“Replace in Path”。 2.在“Find”框中输入需要搜索的内容。在“Scope”中选择需要搜索的范围,可以选择“Project”、“Directory”、“Open Files”或自定义范围。 3.设置好搜索范围后,在“Replace with”框中输入需要替换的内容。 4.点击“Find”按钮进行搜索,可以看到所有包含搜索内容的地方。 5.在搜索结果中,可以预览搜索结果,也可以直接替换。如果需要替换所有搜索内容,可以点击“Replace All”按钮。 6.搜索完成后,可以通过“Preview”选项卡查看搜索替换的结果,并确认是否替换成功。 7.在搜索替换过程中,可以通过“More”按钮进行高级设置,如设置匹配大小写、正则表达式、包含和排除的文件类型等。 总之,IntelliJ IDEA的全局内容搜索替换功能极为强大,方便开发者快速查找和替换项目中的内容,提高工作效率。 ### 回答2: intellij idea是一种高效的Java开发工具,支持全局内容搜索替换功能。使用该功能可以快速找到并修改代码中的错误和问题。下面将为您介绍intellij idea全局内容搜索替换教程图解。 1. 设置搜索范围: 在IntelliJ IDEA中,您可以通过编辑器顶部的“Find”输入框或使用“Ctrl + Shift + F”快捷键打开全局搜索替换窗口。在搜索框中输入要查找的内容,然后选择要搜索的范围,如工程、目录、模块等。 2. 搜索内容: 在搜索框中输入要查找的内容,如要查找的方法、关键字等。您可以使用各种搜索选项指定要查找的内容类型。此外,您还可以使用正则表达式进行高级搜索。 3. 替换内容: 在搜索窗口下方的替换区域中输入要替换的内容,然后单击“Replace”按钮,或使用“Ctrl + Shift + R”快捷键,IntelliJ IDEA将在搜索范围内查找并替换所有匹配项。 4. 搜索结果: 搜索结果将显示在搜索窗口的底部。您可以通过单击每个搜索结果来快速跳转到其在代码中的位置。如果搜索结果太多,您可以使用过滤器来缩小搜索范围。 5. 高级搜索: 在搜索窗口右侧,您可以使用“Scope”、“File Masks”等选项指定更高级的搜索配置。如,您可以使用“Scope”选项将搜索范围限制在特定的类或包中,以便更快地找到所需的内容。 以上是intellij idea全局内容搜索替换教程图解,相信您已经学会了如何在IntelliJ IDEA中使用全局搜索替换功能,希望能够帮助您提高编程效率。 ### 回答3: IntelliJ IDEA 是一款非常强大且流行的 Java 集成开发环境,拥有许多优秀的功能。在这种环境下,进行全局内容搜索替换是非常有必要的,可以大大提高开发效率。下面将带大家学习 IntelliJ IDEA 的全局内容搜索替换功能。 首先我们在 IntelliJ IDEA 中打开想要进行搜索替换的项目。接着点击菜单栏中的 Edit 按钮,再选择 Find,会出现如下所示的弹出框。 在这个弹窗中,我们即可进行搜索操作,输入要搜索的内容,然后选择搜索选项:在项目、在路径、在文件中搜索,并设置是否区分大小写和搜索的范围(新窗口或者当前窗口)。 如果选择的是在项目中搜索,则可以选择四个搜索范围:全文、类名、方法名、注释。如,我们想要在项目中搜索名为 "example" 的类,就可以选择 "类名",然后输入 "example",搜索结果即可出现。 如果需要进行替换操作,则可以点击 Replace 选项卡,输入要替换的内容,然后选择替换的选项:在项目、在路径、在文件中替换。同样可以设置是否区分大小写以及替换范围。 在替换过程中,我们可以使用替换替换所有和替换并下一个进行操作。如果要手动确认替换,可以点击查看替换(Show Replace Preview)按钮。 比如,在项目中,我们可以将名为 "example" 的类名替换成 "demo"。如果我们选择了全文替换,则会把整个项目中所有 "example" 的地方都替换成 "demo"。 总之, IntelliJ IDEA 全局内容搜索替换功能非常强大、易用,对于日常的开发任务非常有帮助。当然,为了能够更好地运用该功能,建议大家在开发过程中注意代码的命名和规范,这样可以极大地提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值