【问题标题】:How can I ignore comments statements /*.....*/ when i reading java file?当我阅读 java 文件时,如何忽略注释语句 /*.....*/?
【发布时间】:2016-03-01 23:33:56
【问题描述】:

如何忽略以"/*" 开头并以结尾的注释语句 "*/" 例如:/*the problem is..*//* problem is very difficult */ ,,我想在逐行读取java文件时删除这些语句

public class filename1 {

      public static void main (String args[])

        {

    try {

      fileName = "C:\\NetBeansProjects\\filename\\src\\filename\\filename.java";

      FileReader fr = new FileReader(fileName);

     BufferedReader br = new BufferedReader(fr);

        line = br.readLine();

        while (line !=null) {


       for( int i=0;i<line.length();i++)

         {            
           b=line.indexOf("/",i);         

           ee=line.indexOf("*",i);         
           if(b!=-1 && ee!=-1)

           v=line.indexOf("*/",i);
             if (v==-1)
              line=" ";
                  }


                System.out.println(line);


                 line = br.readLine(); 
                          }}

                  catch (IOException e)
               {   
                e.printStackTrace();

                  }
                }
                }

【问题讨论】:

  • 从根本上说,不要指望能够用这个小代码编写一个有效的 Java 解析器。例如,考虑包含 /* 的字符串文字。或多次包含它的行...
  • 除非你真的想自己写解析器,尽量使用现有的Java源码解析器库:stackoverflow.com/questions/1967987/…
  • 你没有抓住重点。如果要准确删除 cmets,则必须处理几个非显而易见的场景,例如多行命令、包含字符串 /* 的 cmets 以及包含 /* 的 Java 字符串,例如 String xyz = "/*";,它们不会表示评论。至少您需要编写一个能够理解 Java 标记的词法分析器。不是一个完整的解析器,但用于 Java 的词法分析器已经足够复杂了。
  • 听起来你需要一个简单的状态机,其中状态是“在块注释中”和“不在块注释中”
  • 为什么每个人都说你必须小心评论中的/*?当您找到第一个开始评论的/* 时,您需要做的就是在此行或后续行中找到下一个出现的*/(或其\u 等效项) - 无需寻找第二个@ 987654335@.

标签: java file bufferedreader


【解决方案1】:

只需包括:

int index =  str.indexOf("/*");

while(index != -1) {
    str = str.substring(0, index) + str.substring(str.indexOf("*/")+2);
    index =  str.indexOf("/*");
}

编辑: 假设您必须考虑注释被字符串开头或结尾打断的片段:
Edit2: 现在.. 还假设您必须考虑文字字符串 "/*""*/"

str = str.replace("\"/*\"", "literal_string_open_comment");
str = str.replace("\"*/\"", "literal_string_close_comment");

int start =  str.indexOf("/*"), end = str.indexOf("*/");

while(start > -1 || end > -1) {
    if(start != -1) {
        if(end != -1) {
            if(end < start) {
                str = str.substring(end+2);
            } else {
                str = str.substring(0, start) + str.substring(end+2);
            }
        } else {
            str = str.substring(0, start);
        }
    } else {
        str = str.substring(end+2);
    }

    start =  str.indexOf("/*"); 
    end = str.indexOf("*/");
}

str = str.replace("literal_string_open_comment", "\"/*\"");
str = str.replace("literal_string_close_comment", "\"*/\"");

【讨论】:

  • 现在尝试在自己身上运行这段代码,看看为什么它不是那么“简单”。
  • 如果你的意思是“评论”部分可以在一个片段中开始并在下一个片段中结束,那只是简单地添加一个检查if(str.indexOf("*/") == -1) //deal with it的块
  • 不,我的意思是这段代码中的/*s 不是 cmets 的开始(*/s 也是如此)。
  • 例如;:我要读取的文件是:public class filename { int p=3;诠释 c=pp; System.out.print(p); / 问题很容易解决*/ }} 所以,我将读取文件中除此行之外的所有这些行 /* 问题很容易解决*/
  • @user3449656 没有“不是评论而是真实的行”之类的东西。注释可以出现在行的开头、中间或结尾,其中包含您可能确实想要保留的其他有效 Java 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2011-02-21
  • 2017-04-02
  • 2013-07-23
  • 2015-12-22
  • 1970-01-01
  • 2022-06-29
相关资源
最近更新 更多