【问题标题】:How can I replace a whole line of code through Intellij's find functionality?如何通过 Intellij 的查找功能替换整行代码?
【发布时间】:2016-03-18 15:10:16
【问题描述】:

我正在尝试找到一种有效的方法,通过项目中的多个文件和类从我的源代码中删除所有打印语句。

到目前为止,我发现您可以使用 Ctrl+Shift+F 在所有包含 System.out.println 和 Ctrl+Shift+R 的代码中查找以用其他代码替换该代码(或者在我的情况下什么都不替换),但我无法找到替换整行的方法,只能替换只是 System.out.println 的那部分行

有没有一种简单的方法可以让 Intellij 在行尾进行选择,这样我就不需要在每次提及时都进入源代码并手动删除它?我在以前的线程中看到尝试 System.out.println(*);但这对我不起作用。

【问题讨论】:

    标签: java intellij-idea replace


    【解决方案1】:

    解决办法:

    您要查找的内容称为Structural Search/Replace

    它没有很好的文档记录,但它非常强大一次 你完全理解它。

    Existing Templates 中有几个例子你可以 可能修改和学习,以下将做你是什么 现在询问。

    方法如下:

    转到菜单:Edit -> Find -> Replace Structurally 并使用以下Search Template

    System.out.println($EXPRESSION$);
    

    检查Case Sensitive 并使File Type = Java Source

    将所有搜索的Scope 设置为Project Files

    如果您只想将其全部删除,只需确保 Replace Template 字段为空白即可。

    您可以使用Replace Template//System.out.println($EXPRESSION$);/* System.out.println($EXPRESSION$); */ 将它们全部注释掉

    更好的解决方案:

    使用Structural Search/Replaceprivate static final Logger L = LoggingFactory($Class$.class); 添加到所有具有 System.out.println() 声明。

    然后将所有System.out.println($EXPRESSION$);替换为L.info($EXPRESSION$);

    您甚至可以执行以下复杂的操作:

    这只是一个示例,catch 的主体只需要 System.out.println($EXPRESSION$) 一个更复杂的块来抓取其他表达式并保留它们,这对读者来说是一个练习。 em>

    try {
      $TryStatement$;
    } catch($ExceptionType$ $ExceptionRef$) {
      System.out.println($EXPRESSION$);
    }
    

    try {
      $TryStatement$;
    } catch($ExceptionType$ $ExceptionRef$) {
      L.error($EXPRESSION$);
    }
    

    最佳解决方案:

    始终使用Logger 而不是System.out.println() in 一切。即使在用于实验的scratch 类中,它们最终也会在某个时候出现在生产代码中!

    【讨论】:

    • 哇,我会说我是一个相对新手的程序员,这是一个非常简单的解决方案,而且没有太多麻烦。不过,我不完全确定我理解你对记录器的意思。您的意思是写入文件而不是打印到控制台,以便稍后我可以在需要时查看日志?
    • 日志记录可以同时到控制台和一个或多个文件,比System.out.println()根除以后花费的时间更少。
    【解决方案2】:

    使用正则表达式替换换行符。

    crtlshiftr,勾选“正则表达式”,然后

    Text to find: .*System\.out\.println.*[\r\n]+
    Replace with: <leave blank>
    

    .* 不会匹配换行符,但表达式 [\r\n] 匹配(在所有操作系统上)。

    【讨论】:

    • @Efie 立即尝试。我在前面加了一个.*
    • 仍然没有骰子。只是为了澄清这里 --> i.imgur.com/qXbmLjq.png 是我添加的 * 和这里 --> i.imgur.com/MLVyyRU.png 是我正在寻找的一些例子
    • @JarrodRoberson 首先,正则表达式 [\r\n]+ 表示 any 数量的 any 行尾组合,因此无论如何它都会按预期工作您正在使用的操作系统。其次,这适用于大多数println 的情况,它几乎总是单独出现在一行中。它有效 - 恕我直言,没有什么“不幸”的。
    • 它将不匹配System.out.\nprint(\n"somecrap"\n);\n。我必须消除 30K+ 行这种疯狂的行为,因为承包商发现他们可以使用这个技巧来获取过去的声纳报告。 \n 有时在 print 之前在不同的地方,有时在 ( 之前,有时两者都在。一个幼稚的正则表达式不会匹配它们,一个可能会非常复杂并且可能仍然无法匹配它们,并且在任何情况下都可能会有很多误报。 Structural Search/Replace 找到了它们,不管新行是否有诡计,而不是一个误报。
    猜你喜欢
    • 2013-08-31
    • 2021-01-22
    • 2011-05-15
    • 2022-06-15
    • 2016-11-15
    • 2013-08-21
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多