【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方法只能写在 ...
随机推荐
- IP positioning check position
1.如何找到网上散布不法言论的人的地理位置 比方像微博发布的时候都会自动添加主机网络地址,需要对头文件进行分析 找到IP地址 然后进行反查IP地址的位置 , 如果是可以与要查的终端可以进行通信 ,可以 ...
- Android GOT Hook
最后介绍的这种hook方式原理比较简单,只需要将GOT表中的目标函数地址替换为我们自己的函数地址即可,但它的缺点是只能对导入函数进行hook,还需要对elf文件的结构有所了解. 一.获取到GOT表在内 ...
- NTP时间服务器+DHCP服务器的搭建
一.构建NTP时间服务器 ntp服务器监控端口UDP:123 安装ntp和ntpdate 命令:yum -y install ntp netdate 修改配置文件/etc/ntp.conf 启动nt ...
- binlog2sql安装
3.pip安装 3.1 首先安装setuptools软件包: (1)下载setuptools包 wget https://pypi.python.org/packages/source/s/setup ...
- 本地安装部署ActiveCollab
ActiveCollab是一个非常易于使用.基于Web.开源的协作开发与项目管理工具. 我们公司一直在用这款工具,进行任务分配和时间填写,十分简便 ActiveCollab可以利用它轻松地搭建一个包括 ...
- 安装 docker-compose 配置 lnmp
1.安装docker-compose 确保已经安装了docker sudo curl -L "https://github.com/docker/compose/releases/downl ...
- maven报错找不到依赖
遇到一个巨坑 跑公司的一个项目,拉下来代码,跑不起来.发现maven一直报这个错 was cached in the local repository,resolution will not be r ...
- 【转】MarkDown添加图片的三种方式
原文:https://www.jianshu.com/p/280c6a6f2594 ----------------------------------------------------- 插图最基 ...
- Keras神经网络data generators解决数据内存
在使用kears训练model的时候,一般会将所有的训练数据加载到内存中,然后喂给网络,但当内存有限,且数据量过大时,此方法则不再可用.此博客,将介绍如何在多核(多线程)上实时的生成数据,并立即的送入 ...
- python_并发编程——事件
1.事件 :通过一个信号来控制多个进程同时执行或者阻塞. 一个信号可以使所有的进程都进入阻塞状态,也可以控制所有的进程接触阻塞,一个事件被创建之后,默认是阻塞状态. from multiprocess ...