去除java中的注释小工具开发心得


问题需求:将一个java文件中的注释替换为空字符,即消除java文件中的注释。 输入:一个目标文件绝对路径和输出文件的绝对路径

看似简单,实则需要花脑筋的一件事,最后决定用有限状态机来解决这个问题,参考了Tristan的表驱动方法,很巧妙,链接: http://my.oschina.net/Tristan/blog/34118


状态机如下表:
0:普通字符 代码
1:出现一个/
2://注释态
3:/*注释态
4:/*...*准备结束注释
5:"双引号状态
6:有效转义字符态(双引号后遇到\)
7:'单引号状态
8: 有效转义字符态2(单引号后遇到\)
9:注释结束状态,该状态时打印处理后的注释内容,并清空缓冲区
状态:
/
*
"
\
'
回车
其他字符
0
1
0
5
0
7
0
0
1
2
3
5
0
6
0
0
2
2
2
2
2
2
9
2
3
3
4
3
3
3
3
3
4
9
4
3
3
3
3
3
5
5
5
0
6
5
5
5
6
5
5
5
5
5
5
5
7
7
7
7
8
0
7
7
8
7
7
7
7
7
7
7
9
1
0
5
0
7
0
0

代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;


public class RemoveAnnotation2 {

 static String inputFile = "E:\\test\\test1.java";
 static String outputFile = "E:\\test\\test1_rep1.java ";

 int[][] fsm = new int[10][128];

 int state = 0;

 public static void main(String[] args) {
  // TODO Auto-generated method stub

  if (args.length >= 2) {
   inputFile = args[0];
   outputFile = args[1];
  }
  RemoveAnnotation2 me = new RemoveAnnotation2();
  me.initFSM();

  File input = new File(inputFile);
  File output = new File(outputFile);

  try {
   me.handleFile(input, output);
  } catch (Exception ex) {
   ex.printStackTrace();
  }

 }

 public void initFSM() {
  //初始化状态机
  for (int i = 0; i < 128; i++) {
   fsm[0][i] = 0;
   fsm[1][i] = 0;
   fsm[2][i] = 2;
   fsm[3][i] = 3;
   fsm[4][i] = 3;
   fsm[5][i] = 5;
   fsm[6][i] = 5;
   fsm[7][i] = 7;
   fsm[8][i] = 7;
   fsm[9][i] = 0;
  }
  fsm[0]['/'] = 1;
  fsm[0]['"'] = 5;
  fsm[0]['\''] = 7;
  fsm[1]['/'] = 2;
  fsm[1]['*'] = 3;
  fsm[1]['"'] = 5;
  fsm[2]['\n'] = 9;
  fsm[3]['*'] = 4;
  fsm[4]['/'] = 9;
  fsm[4]['*'] = 4;
  fsm[5]['"'] = 0;
  fsm[5]['\\'] = 6;
  fsm[7]['\\'] = 8;
  fsm[7]['\''] = 0;
  fsm[9]['/'] = 1;
  fsm[9]['"'] = 5;
  fsm[9]['\''] = 7;

 }

 public int parseChar(char a) {
  int result = a;
  return result;
 }

 public char parseInt(int a) {
  char result = (char) a;
  return result;
 }

 public void handleFile(File in, File out) throws Exception {

  int c;
  String temp = "";
  char[] cbuf = null;

  BufferedReader br = new BufferedReader(new FileReader(in));
  BufferedWriter bw = new BufferedWriter(new FileWriter(out));

  while ((c = br.read()) != -1) {

   state = fsm[state][c];
   temp = temp + parseInt(c);
   switch (state) {
   case 0:
    bw.write(temp);
    temp = "";
    break;
   case 9:
    //注释结束态,将除了换行的字符全部替换为“ ”输出。
    cbuf = temp.toCharArray();
    for (int i = 0; i < cbuf.length; i++)
     if (cbuf[i] != '\n')
      cbuf[i] = ' ';

    bw.write(cbuf);
    temp = "";
    cbuf = null;
    break;
   }
  }

  br.close();
  bw.close();

 }

}

Reference:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python去除Java文件注释,可以使用正则表达式和字符串处理的方法。 首先,我们可以使用正则表达式来匹配Java注释的模式。Java注释有两种形式:行注释(以双斜线“//”开始)和块注释(以“/*”开始,以“*/”结束)。我们可以使用正则表达式“//.*|/\*.*?\*/”来匹配注释的模式。 接下来,我们需要读取Java文件的内容,并使用正则表达式匹配注释的模式,并将匹配到的注释替换为空字符串。可以使用Python的re模块来实现正则表达式操作。 下面是一个简单的Python代码示例,演示了如何去除Java文件注释: ```python import re def remove_comments(file_path): # 读取Java文件内容 with open(file_path, 'r') as file: content = file.read() # 使用正则表达式匹配注释模式并替换为空字符串 content = re.sub(r'//.*|/\*.*?\*/', '', content, flags=re.S) # 将处理后的内容写回Java文件 with open(file_path, 'w') as file: file.write(content) # 调用示例 java_file_path = 'example.java' remove_comments(java_file_path) ``` 以上代码,我们定义了一个`remove_comments`函数,接受Java文件的路径作为参数。函数内部使用`open`函数读取文件内容,并使用`re.sub`函数替换匹配的注释模式为空字符串。最后,将处理后的内容写回Java文件。 注意:这只是一个简单的实现示例,不能处理所有可能的情况。对于复杂的注释模式或特殊情况,可能需要进一步优化或修改正则表达式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值