Java 什么是正则表达式来代替“所有”;System.out.println();有空的空间吗?
我需要从eclipse上的代码中删除所有System.out语句 例如:Java 什么是正则表达式来代替“所有”;System.out.println();有空的空间吗?,java,regex,Java,Regex,我需要从eclipse上的代码中删除所有System.out语句 例如: System.out.println("hello"); System.out.println("hello" +a); System.out.println(1 +b12); 基本上所有的System.out语句,不管它们的参数是什么 我必须做到以下几点,但它甚至没有接近 System.out.println(.)*`` 试试这个:System.out.println\(.*?\) 对于那些不相信的人(它是用JavaS
System.out.println("hello");
System.out.println("hello" +a);
System.out.println(1 +b12);
基本上所有的System.out
语句,不管它们的参数是什么
我必须做到以下几点,但它甚至没有接近
System.out.println(.)*``
试试这个:
System.out.println\(.*?\)
对于那些不相信的人(它是用JavaSscript编写的,不是Java,但同样的模式在任何地方都适用)
编辑此regexp:
/System\.out\.println\(?作为替代,您可以尝试使用程序顶部的System.setOut(somePrintStream)
将System.out重定向到其他地方(或任何地方)
如果您在Eclipse中运行,它还将允许您指定System.out应该放在哪里,而不是普通的控制台视图(运行配置中的某个地方)
并且如果这是为了排除调试日志记录,请考虑替换它,而不是调用日志记录框架。然后,可以在运行时打开或关闭它。
你必须避开括号
星号应紧跟在点后面,表示“任意字符数”
您应该避免使用*
来捕获整个程序,因此请使用一些在输出语句中没有出现的分隔符,例如;
总的来说,我会用
System.out.println\([^;]*\);
最简单的方法是忽略括号。唯一可以确定的是,语句将以“;”结尾,并且很可能(取决于代码样式)以新行结尾
如果没有行分隔符,*?
很有可能匹配您不匹配的任何内容
^System\.out\.println.*?;\s*$
您可以使用下面的正则表达式,只需查找和替换即可。在Eclipse
中有一个用于正则表达式查找和替换的选项
System.out.println\(([^;].*\)*);
我测试了一下
System.out.println(" ");
System.out.println(" fdfdf");
System.out.println(") fdfdf");
System.out.println(";");
System.out.println();
可以帮助您在Eclipse
是regex online test。我在那里放了一些数据。任何人都可以用任何东西进行测试。其他一些建议会得到大部分,但它们大多会忽略一些迂腐的情况,例如SomeOtherSystem.out.println,或“此字符串包含一个System.out.println()”甚至“class System(){public Someting out;…};System.out.println(“这不是你想象的那样”)
最终,你不可能100%完美地用正则表达式来解释Java,这一次你似乎只想从你自己的代码库中删除它们,所以就用它来检查结果吧
如果您真的想正确地实现自动化(例如,如果您想构建一个工具来实现这一点),我建议您使用一个真正的Java解析器,就像这样:为什么您不能试试这个呢?它也可以做到这一点
在Eclipse中,CTRL+F给出了Find/Replace
窗口
查找字符串-System.out.println
替换字符串-//System.out.println
万岁,你把所有的系统输出都注释掉了!这很难,原因有几个:
- 与大多数语言一样,Java在中是一种类型2(上下文无关)语言。这意味着
println
参数中可以有任意复杂的语句,例如println(doA(4+(-1))+格式(“);”);
这使得使用正则表达式很难找到println
语句的结尾。唯一可靠的方法是根据代码的类型2属性(as)解析代码,或者将其留给eclipse的重构方法(as)等工具
- 按照正则表达式的方法,您可能会查找行的开始/行的结束,例如
^\s*System\.out\.println\(*);\s*$
,但这不会捕获多行-println
-语句
- 您不会找到一个正则表达式来捕捉参数可能是什么样子的所有可能情况
总而言之:是最好的选择。尽管这意味着您的代码必须已经相应地编写好。我会选择以下(当然是有风的)路线:
创建一个类my.domain.replaceheloper
,其中包含一个公共静态void helpMeToReplaceSysouts(objectobj){}
在源代码中搜索并替换System.out.println
以查找my.domain.replaceheloper.helpMetoReplaceSystOuts
重构:内联helpMeToReplaceSysouts
方法
*?
…您将用该代码替换代码的一大部分:D@vladkras真的:-但是我没有否决你的答案。如果你只是记住了最初的例子,那么你应该改变你的软件开发方法。预料不到意外。最初的问题是替换所有system.out调用。没有任何内容OP表示带有parantises的输出字符串可以打折。您也不能打折System.out.println(someobject.toString())
我已经删除了我的否决票。但是我觉得我必须指出/System\.out\.println\((?参见answer.Tricky。该语句可能跨越多行。要打印的部分可以包含各种内容(想想“');”)。System.out
在某些地方可能被称为其他内容。风险…假设您有这样的语句:if(boolean)System.out.println(“”);删除System.out行会改变程序的执行方式,甚至可能不会出现编译错误!@jimjim,如果您有if(boolean)System.out.println(“”)这样的行;
你真的需要更好的编码约定。@stt lcu我完全同意……但是如果你的代码中有一大堆System.out.println,我已经在想你的约定可能不严格,所以我不会在这里做任何假设!如果我做println(;”)
,那你就有麻烦了;-)println
语句可以跨越多行。这很难看,但确实经常发生。请参阅我的ed