【问题标题】:Java regular Expression to replace System.out.println patterns用于替换 System.out.println 模式的 Java 正则表达式
【发布时间】:2013-05-12 11:31:17
【问题描述】:

我们正在开发一个 Eclipse 插件工具来从工作区项目中删除 sysout 语句。我们只能部分实现我们的目标。如果系统输出在一行中,我们可以轻松删除它。但是如果 sysout 跨越了几行(通常是由于代码格式化而发生的),这就是我们面临的问题。

例如:

System.out.println("Hello World");

删除这一行的正则表达式很简单:

System.out.println*

但是如果代码是这样的:

System.out.println(New Line)("HelloWorld");

这就是问题所在。谁能建议我如何使用 java 正则表达式替换它。

【问题讨论】:

  • 如果你正在构建一个 Eclipse 插件,你就可以访问 Java AST,那么为什么还要使用正则表达式呢?
  • 您不能使用正则表达式来执行此操作,因为您需要找到相应的右括号(或正确的分号,但这不会容易得多)。您可以查看此问题的答案以获取替代方法stackoverflow.com/questions/546433/…
  • 请注意,对于这种情况,'System.out.println*' 不是正确的正则表达式,因为 '.'是任何字符。
  • 正如@user2758929 所说,您应该仔细查看现有的API,主要是JDT,但也存在MoDisco 例如

标签: java regex


【解决方案1】:

我建议

String regex = "System\.out\.println[^)]+[)]\s*;"

[^)]+ 将扫描到右括号的位置。但是,这会在多种情况下失败:

  • (可能不平衡)输出中的括号
  • 注释掉的代码
  • 可以省略“;”的少数情况
  • 将 System.out 分配给另一个变量而不是直接使用的情况

加倍努力并使用Eclipse's in-built parser(它可以理解词法问题、cmets,并且可以标记对 System.out 的任何编译时引用)。

【讨论】:

  • 感谢您的回复。正如您所说,正则表达式工作正常,尽管有一些缺点。我试图找出如何使用 AST Parser 处理这种情况。我正在通过 API。如果您可以共享任何可以使用此 API 在编译单元中搜索字符串模式实例的示例代码,那将非常有帮助。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 2014-09-09
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多