【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虚拟机原理的教程或者博客中 ...
随机推荐
- Oracle数据库 常用SQL
-- 查询所有数据 SELECT * FROM [TABLE_NAME]; -- 查询数据总量 SELECT COUNT(*) AS COUNT FROM [TABLE_NAME]; -- 清空表内所 ...
- mysql安装好需要启动和停止服务
启动mysql: mysql.server start 停止服务:mysql.server stop
- Oracle SQL developer客户端 如何连接已经安装完毕的Oracle服务器端
对于刚刚安装完毕Oracle数据库后不知道如何链接使用,可参考以下解决方案. Part 1 首先说服务: 如果正确安装Oracle 11g客户端的朋友们注意了,想要Oracle数据库正常启动有如下三个 ...
- elementUI 控制 DatePicker组件 不能选择 设定的日期
<el-date-picker v-model="date" type="daterange" range-separator="至" ...
- Dubbo源码分析(4):Protocol
Protocol接口是Dubbo框架的核心组件.Dubbo框架启动protocol接口实现类,由spring的xml文件配置决定.RegistryProtocol协议是Protocol协议的核心,它负 ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(1) Selective Search
Selective Search for Object Recoginition 这篇论文是J.R.R. Uijlings发表在2012 IJCV上的一篇文章,主要介绍了选择性搜索(Selective ...
- https://www.cnblogs.com/myblogs-miller/p/9046425.html
# SpringBoot中CommandLineRunner的作用> 平常开发中有可能需要实现在项目启动后执行的功能,SpringBoot提供的一种简单的实现方案就是添加一个model并实现Co ...
- byte[] 转 2进制字符串
/byte[]转为二进制字符串表示byte[] bytesTest =new byte[]{16,18,33}; string strResult=string.Empty;string strTem ...
- ps -p {pid} -o etime获取进程运行时间是如何计算出来的?
ps -p 986 -o etime可以获取进程986的执行时间,不论系统时间有没有发生改变,它都可以返回正确的结果: -bash-4.2$ ps -p 986 -o etime ELAPSED 13 ...
- lixuxmint系统定制与配置(4)-应用安装
小书匠Linux 先简单列一下,其实每个软件都有自己的个性化配置,以后有时间了,逐个记录下来.编程主力环境是Python,编辑器使用Jupyter,这个编辑器是在远程服务器启动,映射端口到本地来编辑. ...