下述正則在文本編輯器中使用,統一沒有加定界符,如果要在不同語言中使用,可能需要添加定界符。
在項目中,我們常常有統計代碼行數的需要,但是如果不利用第三方工具的話,面對一個項目(甚至一個工程或解決方案中若干個項目)中成百上千的代碼文件,實在有一種力不從心的感覺。
但利用正則表達式可以巧妙解決。用的工具不是別的,正是所有的IDE(Visual Studio、Eclipse等等)和常用的文本編輯器(SublimeText2、Notepad++等)日常必備軟件的“在文件中查找”,不同的軟件略有不同,但大同小異。
再復雜的IDE,其搜索功能也是基于字符串的匹配進行的。我們知道,文本中每次換行會增加一個 \n 。如果直接用正則\n每一個匹配項就代表一次換行。但需要注意的是文件的最后一行是沒有換行符的,所以文本行數=文件數+換行符數目,因而把兩個看到的兩個數字加起來才是文本行數。
^.*$
表示搜索條件為行首與行尾之間包含任意個任意字符(非換行符)。
上面的方法可以很迅速地得到代碼行數,不過遺憾的是統計結果把空行(僅包含空格和制表符的行)也統計進去了,然而很多時候我們并不想把這些文本也給算進代碼量里去,怎么辦呢?別急,我們只要對正則表達式做一點點修改。我的思路是,只需要找出一個不是空格或制表符的字符即可,于是可寫出了這個正則表達式
^\s*[^\s]+.*$
它表示先忽略一行前面的連續空格和制表符等,然后尋找是否有一個字符不為空格、制表符、換行符和回車符,如果有則表明這行不為空行。
不用 ^\s*\S+.*$
是為了下面方便添加其他要排除的注釋行或者獨立的括號行。
在實際項目中,我們或許認為注釋行不應成為生產量,應從統計數據中排除出去。我們首先要能夠對注釋行有一個認識。很多程序設計語言中,注釋行都會用“/”或者“#”等字符開頭。我們假設項目中的注釋行都是以“/”或“#”開頭的(請讀者考慮自己項目的特點自行修改)。下面的正則表示,我們要查找的是一行中第一個非空字符不是“/”或“#”或“{”或“}”的行
^\s*[^\s/#{}]+.*$
^\s*[^ \t\n\r/#{}]+.*$
作用同上,說明在中括號[]內自定義原子表,打個空格,也可以代表空格。
因為控制開頭和結尾,所以 + 后不必加問號 ? 取消貪婪模式了。
^\s*[^\s/#{}]+
也行,但是上面加上控制結尾比較嚴謹。另外,文本編輯框默認是視為單行的,沒有設置多行模式,如果設為多行模式就得注意了。php 中,在定界符最右邊加 m 即可視為多行。