现在的软件项目多数情况下都是多个人一起开发,每个人的编码规范可能都不一样。有些是写C++的,有些写过java,有些还是C风格,导致代码看起来结构很混乱。在以前带过的项目里面,也有试过在项目开始时就制定了一些编程规范,但是效果不佳。经常遇到有问题需要排查,但涉及到别人的代码时,默默地改成自己熟悉的风格,再去细看代码部分(我经常这样干)。最近在网上看到一篇关于使用正则表达式来检查代码规范的文章,写的不错还挺实用的,所以我也就直接拿过来,稍作整理便放上来了:
(1)查if、do、while后是否和(之间有空格
正则表达式:
{^:b*{if\(}|{while\(}|{for\(}|{else:b*if\(}|{switch\(}|{catch\(}}
if(bRight)
{
//...
}
//改成如下:if和(之间有一个空格
if (bRight)
{
//...
}
(2)查等号前后没有空格:
正则表达式:
{={[^:b=]}}|{{[^:b:Sm=!><+:Pd%\*/\|&\^\\~]}=}|{[^:b]{[:Sm=!><+:Pd%\*/\|&\^\\~]}=}
if (NULL==pData)
{
//...
}
//改成如下:==左右都各有一个空格
if (NULL == pData)
{
//...
}
int nDst=nSrc;
//改成如下:=左右都各有一个空格
int nDst = nSrc;
(3)查{是否有另起一行
正则表达式:
{\).*\{}|{namespace.*\{}|{class.*\{}|{enum.*\{}|{struct.*\{}|{else:b*\{}
if (){
//...
}
//改成如下:大括号另起一行
if ()
{
//...
}
(4)查一行是否只定义了一个变量
正则表达式:
{^:b*{int|char|{unsigned:b*char}|void|bool|float|long|unsigned|short|__int64|BOOL|UINT|INT|LONG|byte|BYTE|DWORD|WORD|TCHAR|uint32|time_t|UINT64|INT64|LPCSTR|ULONG|BSTR|HRESULT|HINSTANCE|HANDLE|HBITMAP}:b.*[^],.*[^];}
int i,j,k;
//应改成如下:
int i = 0;
int j = 0;
int k = 0;
(5)查if while do for等后有没有使用大括号,大括号是否独一行
正则表达式:
{[ \t]:b*{if|else|while|switch}:b*{{.*;}|{.*\n.*;}}}
if (bshow)
printf("hello world\n");
//改成如下:加上大括号并另起一行
if (bshow)
{
printf("hello world\n");
}
(6)查变量是否没有初始化
正则表达式:
^:b*{int|char|{unsigned:b*char}|void|bool|float|long|unsigned|short|__int64|BOOL|UINT|INT|LONG|byte|BYTE|DWORD|WORD|TCHAR|uint32|time_t|UINT64|INT64|LPCSTR|ULONG|BSTR|HRESULT|HINSTANCE|HANDLE|HBITMAP}{{:b*}|{:b*\*:b*}}:i{{:b*}|{:b*.∗:b*}};
int i;
//改成如下:变量进行初始化
int i = 0;
(7)<前后和>前后都应该要有空格才对
正则表达式:
{:b*{for|if|while}.*{{[^:b-<>][<>]}|{[^-<>][<>][^:b=]}}}
if(i<2)
//改成如下:<前后应要有空格
if(i < 2)
(8)查switch语句是否有default分支
直接查找switch,然后看是否有default分支。
看看每个case语句处是否有break语句;
若觉得是异常,可在default分支加上assert等防御性代码看看。
(9)查<<前后是否有空格
正则表达式:
{{{[^:b\n]}\<\<{[^:b\n]}}|{{[^:b\n]}\<\<}|{\<\<{[^:b\n]}}}
cout<<i<<j<<k;
//改成如下:<<左右都加上空格
cout << i << j << k;
(10)代码中函数与之间空一行
各个函数声明之间、各个函数实现之间都空一行,不要出现无谓的多个空行。
要查找空了2个空行以上的可以采用如下正则表达式:
正则表达式:\n\n\n
int max(int i, int j)
{
return ((i > j)?i:j);
}
int min(int i, int j)
{
return ((i < j)?i:j);
}
(11)计算代码行数
清除空行:
正则表达式:^\s*(?=\r?$)\n
计算代码行数:
正则表达式:b*[^:b#/]+.*
在申请软著时,需要填写代码行数,这时就可以用正则表达式来计算了!