zoukankan      html  css  js  c++  java
  • 【Java.Regex】用正则表达式查找Java文件里的字符串

    代码:

    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;
    
    /**
     * 找出Java文件里的字符串
     * @author 逆火
     *
     * 2019年11月19日 下午9:12:59
     */
    public class FindStringInJavaFile {
        public static void main(String[] args) {
            // 最外层(.....):group(1)
            // ":匹配字符串开始的双引号,单个为转义
            // 内层(...)*:前后引号中间的文本,*为括号中的模式重复0-n次
            // \\":匹配"
            // \\\\:匹配\
            // \\n:匹配
    
            // [^"]:除了双引号之外的字符
            // ":匹配字符串结束开始的双引号,单个为转义
    // 注意:对于通常运用,可能 java.util.regex.Pattern pattern=Pattern.compile("("(\\"|[^"])*")"); 就足够了。
    java.util.regex.Pattern pattern=Pattern.compile("("(\\"|\\\\|\\n|[^"])*")"); try (LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("D:\logs\InsertThread.java"));){ String line = null; while ((line = lineNumberReader.readLine()) != null) { Matcher matcher=pattern.matcher(line); while(matcher.find()) { System.out.println("Line " + lineNumberReader.getLineNumber() +":" + matcher.group(0)); } } } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }

    输出:

    Line 63:"Begin to access "
    Line 63:" as "
    Line 63:"..."
    Line 71:"#"
    Line 71:" "
    Line 71:" records were inserted to table:'"
    Line 71:"' used "
    Line 83:"Can't close stmt/conn because of "
    Line 97:"SELECT COUNT (*) as cnt FROM "
    Line 102:"cnt"
    Line 123:"yyyy-MM-dd HH:mm:ss"
    Line 141:"truncate table "
    Line 143:"truncated table:"
    Line 161:":"
    Line 174:"''{"
    Line 174:"}''"
    Line 184:"INSERT ALL "
    Line 191:" select * from dual"
    Line 197:"#"
    Line 197:"-"
    Line 197:" "
    Line 197:" records inserted to '"
    Line 197:"' used "
    Line 212:" INTO "
    Line 212:"("
    Line 217:","
    Line 219:") values("
    Line 222:"PK"
    Line 223:"'"
    Line 223:"'"
    Line 225:"DELIVERY_INFO_HISTORY"
    Line 226:"'0'"
    Line 228:"'"
    Line 228:"'"
    Line 230:"CH"
    Line 231:"'0'"
    Line 232:"US"
    Line 233:"'BatcherUser'"
    Line 234:"DT"
    Line 235:"to_date('"
    Line 235:"','yyyy-MM-dd HH24:mi:ss')"
    Line 238:","
    Line 239:")"
    Line 261:"d"
    Line 261:"h"
    Line 261:"m"
    Line 261:"s"
    Line 263:"h"
    Line 263:"m"
    Line 263:"s"
    Line 265:"m"
    Line 265:"s"
    Line 267:"s"

    用作查找目标的Java文件:

    package com.hy.insert.multithread;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    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;
    
    import com.hy.DBParam;
    
    /**
     * 删单表线程
     * @author 逆火
     *
     * 2019年11月17日 上午9:24:39
     */
    public class InsertThread extends Thread{
        private static Logger log = Logger.getLogger(InsertThread.class);
        
        private final int BatchSize=250;// 一次性插入记录数
        private int tableIndex;// 表序号
        private String tableName;// tablename
        private int count;// record count will be inserted
        private String[] innerArr;// array contains field type and names
        private InsertManager manager;// reference to InsertManager
        
        /**
         * Constructor
         * @param tableIndex
         * @param tableName
         * @param count
         * @param innerArr
         * @param mng
         */
        public InsertThread(int tableIndex,String tableName,int count,String[] innerArr,InsertManager mng) {
            this.tableIndex=tableIndex;
            this.tableName=tableName;
            this.count=count;
            this.innerArr=innerArr;
            this.manager=mng;
        }
        
        /**
         * Run body here
         */
        public void run() {
            Connection conn = null;
            Statement stmt = null;
            
            try{
                long startTime = System.currentTimeMillis();
                
                Class.forName(DBParam.Driver).newInstance();
                conn = DriverManager.getConnection(DBParam.DbUrl, DBParam.User, DBParam.Pswd);
                stmt = conn.createStatement();
                log.info("Begin to access "+DBParam.DbUrl+" as "+DBParam.User+"...");
                    
                truncateTable(tableName,conn,stmt);
                insertDataToTable(tableIndex,tableName,count,innerArr,conn,stmt);
                
                if(isAllInserted(count,tableName,stmt)) {
                    long endTime = System.currentTimeMillis();
                    String timeElasped=sec2DHMS(startTime,endTime);
                    log.info("#"+tableIndex+" "+count+" records were inserted to table:'" + tableName + "' used " + timeElasped );
                    
                    manager.reportFinished(String.valueOf(tableIndex), tableName, timeElasped);
                }
                    
            } catch (Exception e) {
                System.out.print(e.getMessage());
            } finally {
                try {
                    stmt.close();
                    conn.close();
                } catch (SQLException e) {
                    log.error("Can't close stmt/conn because of " + e.getMessage());
                }
            }
        }
        
        /**
         * judge if all records are inserted
         * @param count
         * @param table
         * @param stmt
         * @return
         * @throws SQLException
         */
        private boolean isAllInserted(int count,String table,Statement stmt) throws SQLException {
            String sql="SELECT COUNT (*) as cnt FROM "+table;
            
            ResultSet rs = stmt.executeQuery(sql);
            
            while (rs.next()) {
                int cnt = rs.getInt("cnt");
                return cnt==count;
            }
            
            return false;
        }
        
        /**
         * get datetime n seconds before
         * @param n
         * @param interval
         * @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();
                
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String retval = sdf.format(newDate);
                return retval;
            }
            catch(Exception ex) {
                ex.printStackTrace();
                return null;
            }
        }
        
        /**
         * delete all data in a table quickly
         * @param tableName
         * @param conn
         * @param stmt
         * @throws SQLException
         */
        private void truncateTable(String tableName,Connection conn,Statement stmt) throws SQLException{
            String sql="truncate table "+tableName;
            stmt.execute(sql);
            log.info("truncated table:"+tableName);
        }
        
        /**
         * Insert date to a table
         * @param tbSN
         * @param tableName
         * @param count
         * @param innerArr
         * @param conn
         * @param stmt
         * @throws SQLException
         */
        private void insertDataToTable(int tbSN,String tableName,int count,String[] innerArr,Connection conn,Statement stmt) 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<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+" "+BatchSize+" records inserted to '"+tableName+"' used " + sec2DHMS(startTime,endTime));
            }
        }
        
        /**
         * get insert sql
         * @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("'BatcherUser'");
                }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;
        }
        
        /**
         * change seconds to DayHourMinuteSecond format
         * @param stratMs
         * @param endMs
         * @return
         */
        private static String sec2DHMS(long stratMs,long endMs) {
            String retval = null;
            long secondCount=(endMs-stratMs)/1000;
            
            long days = secondCount / (60 * 60 * 24);
            long hours = (secondCount % (60 * 60 * 24)) / (60 * 60);
            long minutes = (secondCount % (60 * 60)) / 60;
            long seconds = secondCount % 60;
        
            if (days > 0) {
                retval = days + "d" + hours + "h" + minutes + "m" + seconds + "s";
            } else if (hours > 0) {
                retval = hours + "h" + minutes + "m" + seconds + "s";
            } else if (minutes > 0) {
                retval = minutes + "m" + seconds + "s";
            } else {
                retval = seconds + "s"";
            }
        
            return retval;
        }
        
        /**
         * Inner class,used for inner data structure
         * @author 逆火
         *
         * 2019年11月17日 上午9:27:47
         */
        protected static final class TypeField{
            String type;
            String field;
        }
    }

    参考资料:https://www.zhihu.com/question/47381844

    --END-- 2019年11月19日21:15:17

  • 相关阅读:
    P1019 单词接龙
    最小生成树模板题POJ
    区间DP
    牛客多校第三场-A-PACM Team-多维背包的01变种
    洛谷P1004 方格取数-四维DP
    牛客多校第二场A run(基础DP)
    P1494 [国家集训队]小Z的袜子(莫队)
    洛谷:过河卒
    Codeforces Round #486 (Div. 3)-B. Substrings Sort
    判断的值是否为空
  • 原文地址:https://www.cnblogs.com/heyang78/p/11892439.html
Copyright © 2011-2022 走看看