統計代碼行數的小技巧
本文轉自(http://www.zhouhua.info/2013/06/20/skills/)
在項目中,我們常常有統計代碼行數的需要,但是如果不利用第三方工具的話,面對一個項目(甚至一個工程或解決方案中若干個項目)中成百上千的代碼文件,實在有一種力不從心的感覺。
我們期望能夠用最簡單的方法完成這些重要卻細微的需求。下面我給大家介紹一種無需借助第三方工具,無需復雜操作,無需人工統計計算的方法解決這個問題。
統計代碼行數
我們用的工具不是別的,正是所有的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/#]+?.*$ ,此處的 ? 不是必需的
本文旨在介紹一種思路,用最簡單的工具實現看似復雜的功能,省力又高效。也許你還有更好更巧的點子,歡迎與我分享。

本文基于署名-非商業性使用 3.0許可協議發布,轉載、演繹必須保留本文的署名周驊(包含鏈接 http://www.zhouhua.info ),且不得用于商業目的。如您有任何疑問或者授權方面的協商,請與我聯系。
文章列表