`
duanhengbin
  • 浏览: 383420 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用正则表达式高效统计代码

 
阅读更多

最近一直在搞正则相关的东西,利用空闲时间,改善了下原来项目里比较笨拙的统计代码行数程序。

 

思路:采用倒推计算的方法,即先删除空行,再删除注释行,每一步之前都统计下剩余的行数,最后再来算 空白行,注释行,和有效代码行。之所以这样考虑有两个原因:一是,多行注释的行数确认比较麻烦,删除后再算可以简化处理。二是JAVA的正则API缺少计数的功能,直接计数肯定要用循环,而且用很多次,比较麻烦。

 

... 以上为文件读入代码(略)
String separator = "\r\n";
//strFile 为将文件读入字符串
int iCntAll = countMatches(strFile,separator);
//删除空行
strFile = strFile.replaceAll("(?m)^\\s*$"+separator, "");
int iCntNoSpace = countMatches(strFile,separator);
//删除单行注释(注释前有代码的不计)
strFile = strFile.replaceAll("(?m)^\\s*//.*$"+separator, "");
//删除多行注释
//strFile = strFile.replaceAll("(?sm)^\\s*/\\*.*?\\*/\\s*$"+separator, "");
// 10/31修订,在统计一份反编译代码时发现,多行注释后有代码时将发生匹配错误
// 试过几种修补方式未果,改用两次简单的替换来解决
strFile = strFile.replaceAll("(?s)/\\*.*?\\*/", "").replaceAll("(?m)^\\s*$"+separator, "");
int iCntOnlySrc = countMatches(strFile,"\r\n");
int[] linesCnt = new int[3];
//计算空白行 的行数
linesCnt[0] = iCntAll - iCntNoSpace;
//计算注释行 的行数
linesCnt[1] = iCntNoSpace - iCntOnlySrc;
//计算代码行 的行数(总行数-空白行-注释行)
linesCnt[2] = iCntOnlySrc;
... 以下代码略

 

countMatches()函数:该函数通过统计回车换行的个数来获取行数。

public static int countMatches(CharSequence str, CharSequence sub) {
    int count = 0;
    int idx = 0;
    while ((idx = str.toString().indexOf(sub.toString(), idx)) != -1) {
        count++;
        idx += sub.length();
    }
    return count;
}

 上面是所有的关键代码,是不是很清爽。稍加修改还可比较容易地适用于其他各种语言的代码统计。

 附件中包含完整代码。 

 

10月29日更新:改进了报告格式,增加了总行数/百分比的统计。

 试了几个开源库:

spring-framework-3.2.4.RELEASE

空行数 注释行数 代码行数
55293 199712 197342
12% 44% 44%

  

Google guava common (ver:15.0 不含测试用代码):

空行数 注释行数 代码行数
13881 46960 65113
11% 37% 52%

 

 jodd (ver:3.4.8)

空行数 注释行数 代码行数
17015 31728  68312
15% 27% 58%

 

 看来注释方面 SPRING 的开发者还是更加细致。

分享到:
评论

相关推荐

    《Python文本挖掘实战:词频统计高效教程》-计算机科学·Python编程·文本分析·数据预处理

    内容概要:教程从基础的Python编程知识入手,逐步介绍了如何使用Python中的正则表达式、collections模块等工具进行高效的词频统计。同时,针对中文文本的处理,教程还引入了jieba分词库,使得中文词频统计变得简单易...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例076 使用正则表达式验证一年的12个月份 92 实例077 使用正则表达式验证一个月的31天 93 实例078 使用正则表达式验证数字输入 94 实例079 使用正则表达式验证密码长度 95 实例080 使用正则表达式验证非零的正整数...

    cx-extractor

    虽然使用正则表达式可以准确的抽取某一固定格式的页面,但面对形形色色的HTML,使用规则处理难免捉襟见肘。能不能高效、准确的将一个页面的正文抽取出来,并做到在大规模网页范围内通用,这是一个直接关系上层应用的...

    企业网站管理系统YothCMS v1.0 修正版

    增加后台自定义流量统计代码和在线客服代码的添删改6.分离网站配置和核心配置7.修正采集版块,实现按列表批量采集,增强精确度,和下载远程图片到本地8.增减各板块添加信息时验证,防止出现空信息9.完善正则表达式...

    YothCMS 企业网站系统源码 v1.1(双后台界面切换版).rar

    5.增加后台自定义流量统计代码和在线客服代码的添删改 6.分离网站配置和核心配置 7.修正采集版块,实现按列表批量采集,增强精确度,和下载远程图片到本地 8.增减各板块添加信息时验证,防止出现空信息 9.完善...

    asp.net知识库

    .net中的正则表达式使用高级技巧 (一) C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET...

Global site tag (gtag.js) - Google Analytics