在项目中,我们常常有统计代码行数的需要,但是如果不利用第三方工具的话,面对一个项目(甚至一个工程或解决方案中若干个项目)中成百上千的代码文件,实在有一种力不从心的感觉。
我们期望能够用最简单的方法完成这些重要却细微的需求。下面我给大家介绍一种无需借助第三方工具,无需复杂操作,无需人工统计计算的方法解决这个问题。
统计代码行数
我们用的工具不是别的,正是所有的IDE(Visual Studio、Eclipse等等)和常用的文本编辑器(Sublime Text 2、Notepad++等)日常必备软件的“在文件中查找”,不同的软件略有不同,但大同小异。
再复杂的IDE,其搜索功能也是基于字符串的匹配进行的。我们知道,文本中每次换行会增加一个 \n
,所以可以由“\n”出现的次数来推测文本的行数。我们只需要在“在文件中搜索”的输入框内输入 \n
,选项好搜索范围,点击搜索,片刻之后会在相应面板中显示匹配结果。我们不需要关心匹配条目,直接看最后面的统计数据。我们会看到诸如: ` 在xxx个文件中查到xxx个匹配项 ` ,每一个匹配项就代表一次换行。但需要注意的是文件的最后一行是没有换行符的,所以文本行数=文件数+换行符数目,因而把两个看到的两个数字加起来才是文本行数。
图0:搜索 \n
是不是感觉有点麻烦?还要运算,这种方法可不是我们想要的!不过别急,还是“在文件中查找”,勾选“正则表达式”选项,我们换正则表达式。要达到刚刚的效果,我们可以很简单地搜索 ^
或者 $
。正则表达式中, ^
表示行首, $
表示行尾,所以这样的查询就能够查出一共有多少个行首或行尾,也就是代码行数。
图1:搜索 ^
图2:搜索 $
为了更严谨,也为了下文的进一步探索,这里我们搜索 ^.*$
,表示搜索条件为行首与行尾之间包含任意个任意字符(非换行符)。 .
表示除换行符外的所有字符, .*
表示0到任意多个 .
。
图0:搜索 ^.*$
本文重点不在说明正则表达式的用法,如果对正则表达式的语法有疑问,还请阅读其他参考资料。
统计代码行数并排除空行
上面的方法可以很迅速地得到代码行数,不过遗憾的是统计结果把空行(仅包含空格和制表符的行)也统计进去了,然而很多时候我们并不想把这些文本也给算进代码量里去,怎么办呢?别急,我们只要对正则表达式做一点点修改。我的思路是,只需要找出一个不是空格或制表符的字符即可,于是我写出了这个正则表达式 ^[ \t]*[^ \t\n\r]+.*$
,它表示先忽略一行前面的连续空格和制表符,然后寻找是否有一个字符不为空格、制表符、换行符和回车符,如果有则表明这行不为空行。到这里为止,我们可以写出 ^[ \t]*[^ \t\n\r]+
,这个正则也是可以工作的,不过我习惯把一行写完整。
也许有人会写出类似于 ^\s*\S+.*$
或者 ^:b*[^:b]+.*$
这样的正则,不过经我测试,或多或少存在兼容性问题,主要存在两个问题:
1. \s
可能包含 \r
,那么 ^\s*
匹配空行的时候可能会穿透到后面的文本行,直到某一行不为空,这种方法可能无法排除文本内部的空行;
2. :b
这样的写法并不是所有的正则解释器都能识别,不建议使用。Visual Studio 2012也已经抛弃这种写法,改为 [ \t]
。
图0:搜索 ^[ \t]*[^ \t\n\r]+.*$
统计代码行数并排除空行和注释行
在实际项目中,我们或许认为注释行不应成为生产量,应从统计数据中排除出去。似乎这个问题棘手得多。不过别担心,只要善于利用正则表达式,这个问题也能轻松解决。
我们首先要能够对注释行有一个认识。很多程序设计语言中,注释行都会用“/”或者“#”等字符开头。我们假设项目中的注释行都是以“/”或“#”开头的(请读者考虑自己项目的特点自行修改),那么我们要查找的是一行中第一个非空字符不是“/”和“#”的行。跟上一节类似地,我们可以写出 ^[ \t]*[^ \t\n\r/#]+.*$
。同样,为了更好的兼容性,这里我避免使用 \s
和 :b
。
图0:搜索 ^[ \t]*?[^ \t\n\r/#]+?.*$
,此处的 ?
不是必需的
本文旨在介绍一种思路,用最简单的工具实现看似复杂的功能,省力又高效。也许你还有更好更巧的点子,欢迎与我分享。