【问题标题】:Remove all comments from java code without regex从没有正则表达式的java代码中删除所有注释
【发布时间】:2017-02-16 21:04:03
【问题描述】:

我正在做一个家庭作业,我需要读取一个 java 源文件并从中删除所有 cmets。其余样式应保持不变。

我已经使用正则表达式完成了任务。

但我希望在不使用正则表达式的情况下完成同样的任务。

示例输入

// My first single line comment

class Student {

  /* Student class - Describes the properties
  of the student like id, name */

  int studentId; // Unique Student id
  String studentName; // Name of the student
  String junk = "Hello//hello/*hey";

} // End of student class

结果

class Student {

  int studentId;
  String studentName;
  String junk = "Hello//hello/*hey";

}

我的想法是阅读每一行

1) 检查前两个字符

  • 如果它以 // ==> 开头,则删除该行

  • 如果它以 /* ==> 开头,则删除 */ 之前的所有行

2) 另一个场景正在处理

示例 - int studentId; // 评论或 /* 评论 */

有人可以提供更好的方法吗?

【问题讨论】:

  • 不检查前两个字符,而是搜索//,然后从该点删除到新行。 /* 的想法相同,但删除直到 */
  • @HypnicJerk 感谢您的回复。如果我搜索整行文本,并且如果我有一个字符串声明,例如 - String junk = "Hello//hello";这可能会导致问题正确
  • @user3451476 您能否提供一个字符串示例,说明它的外观以及您希望它的外观
  • @NickDiv 我已经更新了问题
  • 显然,您的想法行不通,因为您根本没有考虑字符串文字。请记住,在字符串文字中,字符可以通过反斜杠进行转义。哦,那\uxxxx 序列呢?你也应该正确处理这些吗?我怀疑您是否真的“使用正则表达式完成了任务”。但是,如果您拥有并理解基于正则表达式的解决方案,那么手动实现完全相同的逻辑有什么难的呢?

标签: java java-8


【解决方案1】:

如果您想尝试除正则表达式之外的其他方法,那么一种可能性是状态机。至少有五种状态:开始、在普通代码中、在 // 注释中、在 /* ... */ 注释和停止。

在开始状态下开始。每个状态都会处理输入,直到遇到一些使其切换到不同状态的东西。 Stop 状态结束处理,进行任何必要的整理,例如关闭文件。

请记住,您需要处理格式错误的输入,以及偷偷摸摸的输入:

System.out.println("A Java comment may start with /* and finish with */");

我会留给你解决如何处理的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2011-05-23
    • 2012-03-19
    • 2020-09-20
    • 2012-12-31
    相关资源
    最近更新 更多