【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:匹配\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
【Java.Regex】用正则表达式查找Java文件里的字符串的更多相关文章
- linux查找所有文件中某个字符串
查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xar ...
- 【Java.Regex】用正则表达式查找Java源文件中的注释
代码: package regex; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.I ...
- 正则表达式总结 java 等
这个经常用的到,就来总结一下 #一下是JAVA中的正则表达式 在 JDK1.4 里有了自己的正则表达式 API 包,JAVA 程序员可以免去找第三方提供的正则表达式库的周折了,我们现在就马上来了解一下 ...
- 菜鸡的Java笔记 第二十八 - java 包的定义
包的主要作用以及定义 包的导入操作 系统常见的开发包 jar 程序命令 包的定义 在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...
- Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
———————————————————————————————————————————从文件中读写字符串(直接读写/通过NSURL读写) #import <Foundation/Foundati ...
- 利用Python从文件中读取字符串(解决乱码问题)
首先声明这篇学习记录是基于python3的. python3中,py文件中默认的文件编码就是unicode,不用像python2中那样加u,比如u'中文'. 不过在涉及路径时,比如C:\Users\A ...
- 从java文件和CS文件里查询方法使用次数工具
前几天,领导让我找一下老系统(Java)里getRemoteUser方法都哪个文件用了,package是什么,方法被调用了多少次,当时因为着急,所以,直接人工找的,但是以后要是再出现,人工找就太讨厌了 ...
- Java查找指定文件中指定字符的个数
package lwl.youweb2.test; import java.io.BufferedReader; import java.io.FileReader; import java.io.I ...
- 《Java虚拟机原理图解》 1.2、class文件里的常量池
[最新更新:2014/11/11] 了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中 ...
随机推荐
- Find 命令记录
当需要查找一个时间的文件时 使用find [文件目录] -mtime [时间] 例如:查看mysql.bak目录下的1天前的文件 find mysql.bak -mtime 找到此文件之后需要将它移动 ...
- 通过扩展redis-cli来实现在redis集群中移动槽位
下面的扩展代码基于redis 5.0.2进行扩展, 对于其他的redis版本, 我没有进行相关的测试.考虑到redis集群的修改频率,这段代码应该同时适用于其他的redis版本. 下面为修改的代码: ...
- goroutine的使用与常见错误
goroutine的使用时常见错误 goroutine是Golang 的核心之一,在使用时,一般都要配合channel一起使用. 在使用时,经常会遇到一些错误,包括: 不输出 输出与希望输出不一致 a ...
- littlefs了解一下
littlefs是一个文件系统,断电数据不会出异常,适合IOT场景.
- python的拷贝方式以及深拷贝,浅拷贝详解
python的拷贝方法有:切片方法, 工厂方法, 深拷贝方法, 浅拷贝方法等. 几种方法都可以实现拷贝操作, 具体区别在于两点:1.代码写法不同. 2.内存地址引用不同 代码演示: import co ...
- python - django (创建到运行流程)
a = 0 """ 1. 创建 Django 操作文件 a. cmd 中选择路径: cd C:\Users\ad\PycharmProjects\index\1\文件名 ...
- 【贪心】Allowance POJ 3040
题目链接:http://poj.org/problem?id=3040 题目大意:你有n种不同面值的硬币,面值为vi的有bi个."硬币的面额均匀地分配下一个更大的面额",即下一个更 ...
- 堆优化/zkw线段树优化 dijkstra
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 200005 ...
- Linux 文件系统缓存 -针对不同数据库有不同作用
文件系统缓存 filesystem cache 许多人没有意识到.文件系统缓存对于性能的影响.Linux系统默认的设置倾向于把内存尽可能的用于文件cache,所以在一台大内存机器上,往往我们可能发现没 ...
- 一次docker镜像的迁移
docker 镜像迁移 背景,本地测试环境要切到线上测试,镜像下载或编译都需要时间. 所以直接scp镜像过去来节省时间. save 相对于export会占用更多存储空间 被迁移服务器导出所有镜像 do ...