2

我需要从我的 Eclipse 代码中删除所有 System.out 语句。

例子:

System.out.println("hello");
System.out.println("hello" +a);
System.out.println(1 +b12);

基本上所有System.out语句,不管它们的参数是什么。

我必须以下,但它甚至没有接近

System.out.println(.)*;?``

4

9 回答 9

5

System.setOut(somePrintStream)作为替代方案,您可以尝试使用程序顶部将 System.out 重定向到其他地方(或无处) 。

如果您在 Eclipse 中运行,它还可以让您指定 System.out 应该去哪里而不是正常的控制台视图(在运行配置中的某个地方)。

如果这是为了摆脱调试日志记录,请考虑不要用任何东西替换它,而是用对日志记录框架的调用来替换它。然后您可以在运行时打开或关闭它。

于 2013-09-11T08:03:56.143 回答
3

您可以使用以下正则表达式并简单地查找和替换。有一个正则表达式查找和替换选项Eclipse

System.out.println\(([^;].*\)*);

我测试了以下

 System.out.println("  ");
 System.out.println("  fdfdf");
 System.out.println(")  fdfdf");
 System.out.println(";");
 System.out.println();

可以帮助您找到正则表达式查找和替换Eclipse

是正则表达式在线测试。我在那里放了一些数据。任何人都可以测试任何东西。

于 2013-09-11T08:10:24.237 回答
3

我会走以下(诚然有风)路线:

  1. 创建一个my.domain.ReplaceHelperpublic static void helpMeToReplaceSysouts(Object obj) {}
  2. 在源代码中System.out.println搜索和替换my.domain.ReplaceHelper.helpMeToReplaceSysouts
  3. 重构:内联helpMeToReplaceSysouts方法。
于 2013-09-11T08:40:38.217 回答
2

你为什么不能试试这个呢?它也能胜任!

在 Eclipse 中,CTRL+F给出Find/Replace窗口。在那给出以下字符串,

查找字符串 -System.out.println 替换字符串 -//System.out.println

万岁,你注释掉了所有的系统输出!

于 2013-09-11T08:11:19.260 回答
1

这很难有几个原因:

  • 与大多数语言一样,Java 是乔姆斯基层次结构中的第 2 类(无上下文)语言。这意味着println参数中可能存在任意复杂的语句,例如这使得使用正则表达式println(doA(4+(-1))+format(");");很难找到语句的结尾。println唯一可靠的方法是根据代码的类型 2 属性解析代码(正如Brandon 指出的那样),或者将其留给诸如 eclipse 的重构方法之类的工具(如RJ 所述)。
  • 遵循正则表达式方法,您可能会寻找行首/行尾的东西,例如^\s*System\.out\.println\(.*);\s*$,但这不会捕获多行println语句
  • 您不会找到一个正则表达式来捕获参数可能是什么样的所有可能情况。

总体而言:Thilo 的答案是最佳选择。虽然这意味着您的代码必须已经相应地编写。

于 2013-09-11T08:33:17.443 回答
0
  1. 你必须转义括号
  2. 星号应紧跟在点之后,表示“任意数量的任意字符”
  3. 您应该避免.*捕获整个程序,因此请使用一些不会出现在输出语句中的分隔符,例如;

总而言之,我会使用类似的东西

System.out.println\([^;]*\);
于 2013-09-11T08:08:21.523 回答
0

最简单的方法是忽略括号。唯一可以确定的是,该语句将以“;”结尾 并且最有可能(取决于代码样式)使用新行。

如果没有行分隔符,.*?则很有可能匹配您不匹配的任何内容。

^System\.out\.println.*?;\s*$
于 2013-09-11T08:08:52.090 回答
0

其他几个建议会得到大部分,但他们大多会忽略一些迂腐的案例,例如 SomeOtherSystem.out.println,或“此字符串包含 System.out.println()”,甚至是“类 System(){ public Someting out; ...}; System.out.println("这不是你想的那样");

归根结底,你不能 100% 完全用正则表达式来解释 Java。听起来您只想将它​​们从您自己的代码库中删除一次,所以只需使用它并检查结果即可。

如果您想真正正确地自动执行此操作(例如,如果您想构建一个工具来执行此操作),我建议您使用真正的 Java 解析器,例如:https ://code.google.com/ p/javaparser/

于 2013-09-11T08:10:32.330 回答
-2

试试这个:System.out.println\(.*?\)

JSFiddle适合那些不相信的人(它是用 JavaScript 编写的,而不是 Java,但相同的模式在任何地方都可以使用)

编辑这个正则表达式:/System\.out\.println\((?<=\().*(?=\))\)/删除所有匹配的括号内:JSFiddle

于 2013-09-11T08:02:39.690 回答