当前位置: 代码迷 >> Eclipse >> eclipse正则表达式替换
  详细解决方案

eclipse正则表达式替换

热度:73   发布时间:2016-04-23 00:41:33.0
Java文件删除所有注释 工具+eclipse批量替换(亲测好使)

最近有个项目要申请著作权,令人比较纠结的是需要提交部分源代码,还必须删除所有注释,变态阿。

百度一阵,好多工具不好使。但是太懒的我还是用工具给整的,不然要死人了。先粘上来工具吧

http://sunbin.iteye.com/blog/1735903

源代码:

工具

import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;  /**   * title: 清除注释   *    * @author Administrator   * @时间 2009-7-30:下午09:28:10   */  public class ClearComment {         /** 根目录 */      public static String rootDir = "C:\\Documents and Settings\\Administrator\\桌面\\hx\\src\\org\\hi";   //"D:\\testdir       // D:\\workspace\\proj_map\\src\\com       public static void main(String args[]) throws FileNotFoundException,              UnsupportedEncodingException {           deepDir(rootDir);       }       public static void deepDir(String rootDir) throws FileNotFoundException,              UnsupportedEncodingException {          File folder = new File(rootDir);          if (folder.isDirectory()) {              String[] files = folder.list();              for (int i = 0; i < files.length; i++) {                  File file = new File(folder, files[i]);                  if (file.isDirectory() && file.isHidden() == false) {                      System.out.println(file.getPath());                      deepDir(file.getPath());                  } else if (file.isFile()) {                      clearComment(file.getPath());                  }              }          } else if (folder.isFile()) {              clearComment(folder.getPath());          }      }       /**      * @param currentDir      *            当前目录      * @param currentFileName      *            当前文件名      * @throws FileNotFoundException      * @throws UnsupportedEncodingException      */     /**      * @param filePathAndName      * @throws FileNotFoundException      * @throws UnsupportedEncodingException      */     public static void clearComment(String filePathAndName)              throws FileNotFoundException, UnsupportedEncodingException {          StringBuffer buffer = new StringBuffer();          String line = null; // 用来保存每行读取的内容          InputStream is = new FileInputStream(filePathAndName);          BufferedReader reader = new BufferedReader(new InputStreamReader(is,                  "UTF-8"));          try {              line = reader.readLine();          } catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          } // 读取第一行          while (line != null) { // 如果 line 为空说明读完了              buffer.append(line); // 将读到的内容添加到 buffer 中              buffer.append("\r\n"); // 添加换行符              try {                  line = reader.readLine();              } catch (IOException e) {                  e.printStackTrace();              } // 读取下一行          }          // 1、清除单行的注释,如: //某某,正则为 :\/\/.*          // 2、清除单行的注释,如:/** 某某 */,正则为:\/\*\*.*\*\/          // 3、清除单行的注释,如:/* 某某 */,正则为:\/\*.*\*\/          // 4、清除多行的注释,如:          // /* 某某1          // 某某2          // */          // 正则为:.*/\*(.*)\*/.*          // 5、清除多行的注释,如:          // /** 某某1          // 某某2           // */           // 正则为:/\*\*(\s*\*\s*.*\s*?)*           String filecontent = buffer.toString();             Map<String, String> patterns = new HashMap<String, String>();           patterns.put("([^:])\\/\\/.*", "$1");// 匹配在非冒号后面的注释,此时就不到再遇到http://           patterns.put("\\s+\\/\\/.*", "");// 匹配“//”前是空白符的注释           patterns.put("^\\/\\/.*", "");           patterns.put("^\\/\\*\\*.*\\*\\/$", "");           patterns.put("\\/\\*.*\\*\\/", "");           patterns.put("/\\*(\\s*\\*\\s*.*\\s*?)*\\*\\/", "");           //patterns.put("/\\*(\\s*\\*?\\s*.*\\s*?)*", "");           Iterator<String> keys = patterns.keySet().iterator();           String key = null, value = "";           while (keys.hasNext()) {               // 经过多次替换               key = keys.next();               value = patterns.get(key);               filecontent = replaceAll(filecontent, key, value);           }           System.out.println(filecontent);           // 再输出到原文件           try {               File f = new File(filePathAndName);               if (!f.getParentFile().exists()) {                   f.getParentFile().mkdirs();               }               FileOutputStream out = new FileOutputStream(filePathAndName);               byte[] bytes = filecontent.getBytes("UTF-8");               out.write(bytes);               out.flush();               out.close();           } catch (IOException e) {               e.printStackTrace();           }       }         /**       * @param fileContent       *            内容       * @param patternString       *            匹配的正则表达式       * @param replace       *            替换的内容       * @return       */      public static String replaceAll(String fileContent, String patternString,               String replace) {           String str = "";           Matcher m = null;           Pattern p = null;           try {               p = Pattern.compile(patternString);               m = p.matcher(fileContent);               str = m.replaceAll(replace);           } catch (Exception e) {               e.printStackTrace();           } finally {               m = null;               p = null;           }           // 获得匹配器对象           return str;         }     } 

eclipse正则表达式替换

用上面的工具替换完成以后,还是不放心,一个一个打开看了看,果然。有的部分 /*   注释内容 换行  */ 没有删除掉。
想起来eclipse有批量替换的功能。百度了一下 /* ?? */的正则表达式。解决了
新建一个项目aa(名字随便),把要替换的java文件全部粘进去,报错、缺少jar包不用理会。

Ctrl + H ,或者 主菜单的Search -->File..

Containing text输入:                                   /\*(.|[\r\n])*?\*/
Regular expression(匹配正则表达式): 打上勾。
File name patterns 输入: *.java
Scope:搜索范围 Working set:            aa

      Scope一定不要选择默认的Workspace,不然工作目录全部把注释给干掉了。
      新建aa搜索范围的的方法:
Scope --> Working set:  --> Choose... --> New.. -->Resource --> Working set name:输入 aa  ,选中 aa(刚才新建的项目) --> Finish  -->  选中刚才新建的aa名, -->  OK

回到查找窗口,Replace... 弹出Replace Text Matches窗口 --> Preview -->  OK

亲测,所有文件的注释都删除掉了。
总结:
eclipse批量替换功能很实用,但是假如都用批量替换 比如万一代码出现了 “//目录”等被错误替换就不好了。
工具不错,再次表示感谢。所以使用工具加eclipse很方便,快捷。

  相关解决方案