zoukankan      html  css  js  c++  java
  • 【Java.Regex】用正则表达式查找Java源文件中的注释

    代码:

    package regex;
    
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.LineNumberReader;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class FindCommentsInJavaFile {
         public static void main(String[] args) {
                // Get content from a txt file,there are several methods to do that
                StringBuilder sb=new StringBuilder();
                try (LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("D:\logs\ThreadInserter.java"));){
                    String line = null;
    
                    while ((line = lineNumberReader.readLine()) != null) {
                        sb.append(line+"
    ");// 
     is necessary
                    }
                } catch (FileNotFoundException ex) {
                    ex.printStackTrace();
                } catch (IOException ex) {
                    ex.printStackTrace();
                } 
                String content=sb.toString();
                
                // (//[^
    ]*):双斜杠注释
                // ((/[*]([*@]|[
    ]|\w|\d|\s|[^\x00-\xff])+[*]/)):斜杠星注释
                // /[*]:Start /*
                // [*@]:allow * @
                // [
    ]:allow new line
                // \w|\d|\s:allow word,digit,space
                // [^\x00-\xff]:allow double bytes characters
                // +:([*@]|[
    ]|\w|\d|\s|[^\x00-\xff]) repeat at least once
                // [*]/:end */
                java.util.regex.Pattern pattern=Pattern.compile("(//[^
    ]*)|((/[*]([*@]|[
    ]|\w|\d|\s|[^\x00-\xff])+[*]/))");
                Matcher matcher=pattern.matcher(content);
                boolean isfindTarget=matcher.find();
                
                while(isfindTarget) {
                    if(matcher.group(1)!=null) {
                        System.out.println("双斜杠注释:" + ":" + matcher.group(1)+"
    ");
                    }else if(matcher.group(2)!=null) {
                        System.out.println("斜杠星注释:" + ":" + matcher.group(2)+"
    ");
                    }
                    
                    isfindTarget=matcher.find();
                }
            }
    }

    输出:

    斜杠星注释::/**
     * Used a thread to insert records to a table
     *
     */
    
    双斜杠注释::// Table's serial number
    
    双斜杠注释::// Tbale's name
    
    双斜杠注释::// how many records should be inserted
    
    双斜杠注释::// array contains table types/fields
    
    双斜杠注释::// Connection used in single thread
    
    双斜杠注释::// statemenet used in single throead
    
    双斜杠注释::// How many times this thread should run
    
    双斜杠注释::// Reference to manager
    
    斜杠星注释::/**
         * Constructor
         * @param tbSN
         * @param tableName
         * @param count
         * @param innerArr
         */
    
    斜杠星注释::/**
         * thread method
         */
    
    双斜杠注释::// Initialize conn/stmt
    
    双斜杠注释::// Clear
    
    双斜杠注释::// Insert
    
    双斜杠注释::///
    
    斜杠星注释::/**
                * 清空一个表的数据,注意此功能有破坏性,不可恢复,注意备份好数据
         * @param tableName
         * @param conn
         * @param stmt
         * @throws SQLException
         */
    
    斜杠星注释::/**
                * 向一个表插入数据
         * @param tableName
         * @param count
         * @param innerArr
         * @param conn
         * @param stmt
         * @throws SQLException
         */
    
    双斜杠注释::// 得到字段名和字段类型
    
    双斜杠注释::// 两年的秒数除以总个数即为间隔
    
    双斜杠注释:://int times=count/BatchSize;
    
    斜杠星注释::/**
                * 得到批量插入语句
         * @param tableName
         * @param typefields
         * @param index
         * @return
         */
    
    双斜杠注释:://values.add("'"+String.valueOf(index)+"'");
    
    斜杠星注释::/**
         * 以当前时间为基准减去数十秒
         * @param n
         * @return
         */
    
    双斜杠注释:://日期减去n*10秒
    
    斜杠星注释::/*3432432432432*/
    
    斜杠星注释::/**
         * 将秒转化为日时分秒
         * @param secondCount
         * @return
         */

    当作目标文件的Java源文件:

    package test.threadinsert;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.log4j.Logger;
    
    /**
     * Used a thread to insert records to a table
     *
     */
    public class ThreadInserter extends Thread{
        private static Logger log = Logger.getLogger(ThreadInserter.class);
        
        private static final int BatchSize=500;
        private int tbSN;            // Table's serial number
        private String tableName;    // Tbale's name
        private int count;            // how many records should be inserted
        private String[] innerArr;  // array contains table types/fields
        private Connection conn;    // Connection used in single thread
        private Statement stmt;        // statemenet used in single throead
        private int times;            // How many times this thread should run
        private InserterManager manager;// Reference to manager
        
        /**
         * Constructor
         * @param tbSN
         * @param tableName
         * @param count
         * @param innerArr
         */
        public ThreadInserter(int tbSN,String tableName,int count,String[] innerArr,InserterManager manager) {
            this.tbSN=tbSN;
            this.tableName=tableName;
            this.count=count;
            this.innerArr=innerArr;
            this.times=count/BatchSize;
            this.manager=manager;
        }
        
        /**
         * thread method
         */
        public void run() {
            try {
                log.info("Start...");
                long startTime = System.currentTimeMillis();
                
                // Initialize conn/stmt
                DbParam_Dev dbParam=new DbParam_Dev();
                Class.forName(dbParam.Driver).newInstance();
                conn = DriverManager.getConnection(dbParam.DbUrl, dbParam.User, dbParam.Pswd);
                stmt = conn.createStatement();
                
                // Clear
                truncateTable();
                // Insert
                insertTestDataTo();
                
                long endTime = System.currentTimeMillis();
                String timeElasped=sec2DHMS((endTime - startTime)/1000);
                log.info("#"+tbSN+" End. "+count+" records have been inserted to '"+tableName+"'.( time elapsed: " + timeElasped +")");
                
                ///
                manager.reportFinished(String.valueOf(tbSN), tableName, timeElasped);
            }catch(Exception ex) {
                ex.printStackTrace();
            } finally {
                try {
                    stmt.close();
                    conn.close();
                } catch (SQLException e) {
                    System.out.print("Can't close stmt/conn because of " + e.getMessage());
                }
            }
        }
        
         /**
                * 清空一个表的数据,注意此功能有破坏性,不可恢复,注意备份好数据
         * @param tableName
         * @param conn
         * @param stmt
         * @throws SQLException
         */
        private void truncateTable() throws SQLException{
            String sql="truncate table "+tableName;
            stmt.execute(sql);
            log.info("truncated table:"+tableName);
        }
        
        /**
                * 向一个表插入数据
         * @param tableName
         * @param count
         * @param innerArr
         * @param conn
         * @param stmt
         * @throws SQLException
         */
        private void insertTestDataTo() throws SQLException{
            // 得到字段名和字段类型
            List<TypeField> typefields=new ArrayList<TypeField>();
            for(int i=1;i<innerArr.length;i++) {
                String temp=innerArr[i];
                String[] arrTmp=temp.split(":");
                
                TypeField tf=new TypeField();
                tf.type=arrTmp[0];
                tf.field=arrTmp[1];
                typefields.add(tf);
            }
            
            List<String> fields=new ArrayList<String>();
            List<String> values=new ArrayList<String>();
            int index=0;
            for(TypeField tf:typefields) {
                fields.add(tf.field);
                values.add("''{"+index+"}''");
                index++;
            }
            
            int interval=2*365*24*60*60/count;// 两年的秒数除以总个数即为间隔
            
            index=0;
            //int times=count/BatchSize;
            for(int i=0;i<this.times;i++) {
                StringBuilder sb=new StringBuilder();
                sb.append("INSERT ALL ");
                
                for(int j=0;j<BatchSize;j++) {
                    index=i*BatchSize+j;
                    sb.append(getInsertSql(tableName,typefields,index,interval));
                }
                
                sb.append(" select * from dual");
                String sql = sb.toString();
                
                long startTime = System.currentTimeMillis();
                stmt.executeUpdate(sql);
                long endTime = System.currentTimeMillis();
                log.info("#"+tbSN+"-("+i+"/"+this.times+") "+BatchSize+" records inserted to '"+tableName+"' used " + sec2DHMS((endTime - startTime)/1000));
            }
        }
        
        /**
                * 得到批量插入语句
         * @param tableName
         * @param typefields
         * @param index
         * @return
         */
        private String getInsertSql(String tableName,List<TypeField> typefields,int index,int interval) {
            String currTime=getDatetimeBefore(index,interval);
            
            StringBuilder sb=new StringBuilder();
            sb.append(" INTO "+tableName+"(");
            List<String> fields=new ArrayList<String>();
            for(TypeField tf:typefields) {
                fields.add(tf.field);
            }
            sb.append(String.join(",",fields));
            
            sb.append(") values(");
            List<String> values=new ArrayList<String>();
            for(TypeField tf:typefields) {
                if(tf.type.equals("PK")) {
                    //values.add("'"+String.valueOf(index)+"'");
                    
                    if(tableName.contains("DELIVERY_INFO_HISTORY")) {
                        values.add("'0'");
                    }else {
                        values.add("'"+String.valueOf(index)+"'");
                    }
                }else if(tf.type.equals("CH")) {
                    values.add("'0'");
                }else if(tf.type.equals("US")) {
                    values.add("'unknown'");
                }else if(tf.type.equals("DT")) {
                    values.add("to_date('"+currTime+"','yyyy-MM-dd HH24:mi:ss')");
                }
            }
            sb.append(String.join(",",values));
            sb.append(")");
            
            String insertSql=sb.toString();
            return insertSql;
        }
        
        /**
         * 以当前时间为基准减去数十秒
         * @param n
         * @return
         */
        private static String getDatetimeBefore(int n,int interval) {
            try {
                Calendar now = Calendar.getInstance();
                
                now.add(Calendar.SECOND,-n*interval);//日期减去n*10秒
                
                Date newDate=now.getTime();/*3432432432432*/
                
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String retval = sdf.format(newDate);
                return retval;
            }
            catch(Exception ex) {
                ex.printStackTrace();
                return null;
            }
        }
        
        /**
         * 将秒转化为日时分秒
         * @param secondCount
         * @return
         */
        private static String sec2DHMS(long secondCount) {
            String retval = null;
        
            long days = secondCount / (60 * 60 * 24);
            long hours = (secondCount % (60 * 60 * 24)) / (60 * 60);
            long minutes = (secondCount % (60 * 60)) / 60;
            long seconds = secondCount % 60;
            
            String strSeconds="";
            if(seconds!=0) {
                strSeconds=seconds + "s";
            }
        
            if (days > 0) {
                retval = days + "d" + hours + "h" + minutes + "m" + strSeconds;
            } else if (hours > 0) {
                retval = hours + "h" + minutes + "m" + strSeconds;
            } else if (minutes > 0) {
                retval = minutes + "m" + strSeconds;
            } else {
                retval = strSeconds;
            }
            
            
            String str="AAA";
            str=""";
            str="";
            str="";
            str="";
        
            return retval;
        }
    }

    --END-- 2019-11-20 10:15

  • 相关阅读:
    数学--数论--HDU 2136(素数筛选法)
    思维+模拟--POJ 1013 Counterfeit Dollar
    数学--数论--莫比乌斯函数
    事半功倍和事倍功半
    一道阿里面试题
    文本分类学习(三) 特征权重(TF/IDF)和特征提取
    汉字字典树
    文本分类学习(二)文本表示
    文本分类学习(一):开篇
    一道网易面试编程题
  • 原文地址:https://www.cnblogs.com/heyang78/p/11895581.html
Copyright © 2011-2022 走看看