统计代码行数的小技巧

原文地址:http://zhouhua.github.io/2013/06/20/skills/

在项目中,我们常常有统计代码行数的需要,但是如果不利用第三方工具的话,面对一个项目(甚至一个工程或解决方案中若干个项目)中成百上千的代码文件,实在有一种力不从心的感觉。

我们期望能够用最简单的方法完成这些重要却细微的需求。下面我给大家介绍一种无需借助第三方工具,无需复杂操作,无需人工统计计算的方法解决这个问题。

统计代码行数


我们用的工具不是别的,正是所有的IDE(Visual Studio、Eclipse等等)和常用的文本编辑器(Sublime Text 2、Notepad++等)日常必备软件的“在文件中查找”,不同的软件略有不同,但大同小异。

再复杂的IDE,其搜索功能也是基于字符串的匹配进行的。我们知道,文本中每次换行会增加一个 
 ,所以可以由“
”出现的次数来推测文本的行数。我们只需要在“在文件中搜索”的输入框内输入 
 ,选项好搜索范围,点击搜索,片刻之后会在相应面板中显示匹配结果。我们不需要关心匹配条目,直接看最后面的统计数据。我们会看到诸如: 在xxx个文件中查到xxx个匹配项 ,每一个匹配项就代表一次换行。但需要注意的是文件的最后一行是没有换行符的,所以文本行数=文件数+换行符数目,因而把两个看到的两个数字加起来才是文本行数。

图0:搜索 

是不是感觉有点麻烦?还要运算,这种方法可不是我们想要的!不过别急,还是“在文件中查找”,勾选“正则表达式”选项,我们换正则表达式。要达到刚刚的效果,我们可以很简单地搜索 ^ 或者 $ 。正则表达式中, ^ 表示行首, $ 表示行尾,所以这样的查询就能够查出一共有多少个行首或行尾,也就是代码行数。

图1:搜索 ^

图2:搜索 $

为了更严谨,也为了下文的进一步探索,这里我们搜索 ^.*$ ,表示搜索条件为行首与行尾之间包含任意个任意字符(非换行符)。 . 表示除换行符外的所有字符, .* 表示0到任意多个 . 。

图0:搜索 ^.*$

本文重点不在说明正则表达式的用法,如果对正则表达式的语法有疑问,还请阅读其他参考资料。

统计代码行数并排除空行


上面的方法可以很迅速地得到代码行数,不过遗憾的是统计结果把空行(仅包含空格和制表符的行)也统计进去了,然而很多时候我们并不想把这些文本也给算进代码量里去,怎么办呢?别急,我们只要对正则表达式做一点点修改。我的思路是,只需要找出一个不是空格或制表符的字符即可,于是我写出了这个正则表达式 ^[ ]*[^
]+.*$
 ,它表示先忽略一行前面的连续空格和制表符,然后寻找是否有一个字符不为空格、制表符、换行符和回车符,如果有则表明这行不为空行。到这里为止,我们可以写出^[ ]*[^
]+
 ,这个正则也是可以工作的,不过我习惯把一行写完整。

也许有人会写出类似于 ^s*S+.*$ 或者 ^:b*[^:b]+.*$ 这样的正则,不过经我测试,或多或少存在兼容性问题,主要存在两个问题:

s 可能包含  ,那么 ^s* 匹配空行的时候可能会穿透到后面的文本行,直到某一行不为空,这种方法可能无法排除文本内部的空行;

:b 这样的写法并不是所有的正则解释器都能识别,不建议使用。Visual Studio 2012也已经抛弃这种写法,改为 [ ] 。

图0:搜索 ^[ ]*[^
]+.*$

统计代码行数并排除空行和注释行


在实际项目中,我们或许认为注释行不应成为生产量,应从统计数据中排除出去。似乎这个问题棘手得多。不过别担心,只要善于利用正则表达式,这个问题也能轻松解决。

我们首先要能够对注释行有一个认识。很多程序设计语言中,注释行都会用“/”或者“#”等字符开头。我们假设项目中的注释行都是以“/”或“#”开头的(请读者考虑自己项目的特点自行修改),那么我们要查找的是一行中第一个非空字符不是“/”和“#”的行。跟上一节类似地,我们可以写出 ^[ ]*[^
/#]+.*$
 。同样,为了更好的兼容性,这里我避免使用s 和 :b 。

图0:搜索 ^[ ]*?[^
/#]+?.*$
 ,此处的 ? 不是必需的

本文旨在介绍一种思路,用最简单的工具实现看似复杂的功能,省力又高效。也许你还有更好更巧的点子,欢迎与我分享。