【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+"\n");// \n is necessary
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
String content=sb.toString();
// (//[^\n]*):双斜杠注释
// ((/[*]([*@]|[\n]|\\w|\\d|\\s|[^\\x00-\\xff])+[*]/)):斜杠星注释
// /[*]:Start /*
// [*@]:allow * @
// [\n]:allow new line
// \\w|\\d|\\s:allow word,digit,space
// [^\\x00-\\xff]:allow double bytes characters
// +:([*@]|[\n]|\\w|\\d|\\s|[^\\x00-\\xff]) repeat at least once
// [*]/:end */
java.util.regex.Pattern pattern=Pattern.compile("(//[^\n]*)|((/[*]([*@]|[\n]|\\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)+"\n");
}else if(matcher.group(2)!=null) {
System.out.println("斜杠星注释:" + ":" + matcher.group(2)+"\n");
}
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秒
斜杠星注释::*/
斜杠星注释::/**
* 将秒转化为日时分秒
* @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();*/
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
【Java.Regex】用正则表达式查找Java源文件中的注释的更多相关文章
- 【Java.Regex】用正则表达式查找Java文件里的字符串
代码: import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; imp ...
- grep 查找bash脚本中的注释代码
出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...
- 菜鸡的Java笔记 第二十八 - java 包的定义
包的主要作用以及定义 包的导入操作 系统常见的开发包 jar 程序命令 包的定义 在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...
- 【Java.Regex】使用正则表达式查找一个Java类中的成员函数
代码: import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; imp ...
- 正则表达式在Java中的使用
目录 介绍 从简单例子认识正则表达式匹配 Java中对正则表达式的支持(各种语言有相应的实现) 初步认识 . + * ? 范围 认识\s \w \d - 下面介绍数字和字母的正则表达, 这是编程中使用 ...
- 浅谈为什么一个java源文件中只能有一个public类?
声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为pub ...
- Java查找指定文件中指定字符的个数
package lwl.youweb2.test; import java.io.BufferedReader; import java.io.FileReader; import java.io.I ...
- 一个java源文件中为什么只能有一个public类。
我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个publi ...
- java---面试题---.java"源文件中可以包括多个类(不是内部类)
答题时,先答是什么,再答有什么作用和要注意什么 一个".java"源文件中可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致,main方法只能写在 ...
随机推荐
- ASP.NET Core 2.2 项目升级至 3.0 备忘录
将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要注意的地方记录在这篇随笔中. TargetFramework 改为 netcoreapp3.0 <Target ...
- docker安装之mariadb
https://hub.docker.com/_/mariadb?tab=description Supported tags and respective Dockerfile links 10.4 ...
- Caused by: org.xml.sax.SAXParseException; lineNumber: 64; columnNumber: 27; The entity name must immediately follow the '&' in the entity reference.
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- 大数据之路week07--day06 (Sqoop 的安装及配置)
Sqoop 的安装配置比较简单. 提供安装需要的安装包和连接mysql的驱动的百度云链接: 链接:https://pan.baidu.com/s/1pdFj0u2lZVFasgoSyhz-yQ 提取码 ...
- test20190825 AmberFrame
100+0+99=199,第二题一分没得不应该. count 给定 \(n\),求合法的 \((x_1,x_2,x_3,\dots,x_{2m})\) 组数.一组 \(x\) 是合法的,当且仅当 \[ ...
- .net框架-栈(Stack)
栈(Stack) 栈代表一个后进先出的集合 栈元素为Object类型 .net框架提供Stack<T>泛型栈类 压栈(Push)和出栈(Pop)是栈的基本操作,压栈入栈顶,出栈也出栈顶. ...
- 五.Protobuf3 枚举
Protobuf3 枚举 定义消息类型时,您可能希望它的一个字段有一个预定义的值列表.例如,假设您希望为每个SearchRequest添加一个corpus字段,其中语料库可以是UNIVERSAL.WE ...
- Spring源码窥探之:Spring AOP初步使用
AOP即面向切面编程.它的底层实际是用了spring的动态代理,具体是JDK的代理还是CGLIB的代理,就视情况而定了.本博客园仅仅作为平时记录,显得有些杂乱无章,如果想了解动态代理,设计模式,请访问 ...
- 软件测试过程中如何区分什么是功能bug,什么是需求bug,什么是设计bug?
问题描述: 测试过程中如何区分什么是功能bug,什么是需求bug,什么是设计bug? 精彩答案: 会员 土土的豆豆: 本期问题其实主要是针对不同方面或纬度上对于bug的一个归类和定位. 个人认为,从软 ...
- css 为什么给span加vertical-align: middle不起作用?
vertical-align是什么意思?先举个例子! 这句html元素中的文本为什么不能垂直居中. <style> span{ height:60px;vertical-align: mi ...