是这样的,上个礼拜在一个项目的同行评审中,在代码规范这一块当中,有个很小的问题、但也是比较严重的一个问题。新近的员工,我自己也是,以前没有编码经验,写代码时总是不能很好地达到代码规范所要求的那样,比如在每个运算符(如+,-,=,...)的左右两边都要留个空格...经常自己写好后都很自责,但自责过后呢,就赶紧一个个地改过去,心里不好受不说,那个累啊,简直比写文档还烦...最重要的是,给项目经理造成了不好的印象ing,所以,我写了一个小程序,用来自动检测**以上所说的不好习惯,并且自动修改...算是自己毕业以来第二大的一个小作为吧(之前还有一个大一点点的作为嘞,下篇文章说吧)...至于程序和代码嘛,我会与大家一起来完善的...没有用到什么匹配,几乎是c语言的翻版,语法分析嘛,也说不上...呵呵hoho  ..对了,还可以整个文件夹检测...以下是部分代码...
高手们就不要拍我砖啦...给新人我一个鼓励啊~:)for(int i = 0; i < arrLine.Length; i ++ )//追行遍历
   {
    if(arrLine[i].Trim().StartsWith("///") || arrLine[i].Trim().StartsWith("//") || arrLine[i].Trim().StartsWith("/*")) // 忽略以"///" , "//" , "/*"开头的行
    {
     continue;
    }
    else
    {
     for(int j = 0; j < arrLine[i].Length; j ++ )
     {
      if(iFlags == 0 //在引号外面
        && arrLine[i][j] == '/' && arrLine[i][j + 1] == '/')//同时当前指向/,下一个也是/的情况,就是到注释了...
      {
       break;//跳出该行,开始新一行的检测
      }
      if(arrLine[i][j] == ';' && (arrLine[i][j + 1] == '/' || arrLine[i][j + 1] == '\r'))//遇到“;”,且后面一个是//或者是\r(其实为\r\n,到换行位置)
      {
       break;//跳出该行,开始新一行的检测
      }
      if(arrLine[i][j] == '"' && arrLine[i][j - 1] != '\\')//遇到一个引号,同时它的前面一个不是"\"
      {
       iFlags++;//每遇到一个引号,iFlags就加一
      }
      if(arrLine[i][j] == '\'' && arrLine[i][j - 1] != '\\')//遇到一个单引号,同时它的前面一个不是"\"
      {
       iFlag++;//每遇到一个单引号,iFlag就加一
      }      switch(iFlags)
      {
       case 0 ://引号外面
       {
        switch(iFlag)//有单引号的时候...
        {
         case 0 :
          if(IsSignCode(arrLine[i][j])//belongs to ArrSign
           && j < arrLine[i].Length - 1)//and don't reach the last one
          {
//           arrContent[i] = "●" + arrContent[i];
           arrLine[i] = HaveBlankAndChange(arrLine[i], ref j, i + 1);
          }
          break;
         case 1://iFlag是1,在单引号内
          continue;
         case 2 ://第二个单引号
          iFlag = 0;//将iFlag置0
          break;
        }
        break;
       }
       case 1 ://iFlags是1,在引号内
        continue;
       case 2 ://第二个引号
        iFlags = 0;//将iFlags置0
        break;
      }//switch
     }//for
    }//else
   }//for   lErrCount.Text = iErrorCount + " 个";//显示错误个数   for(int l = 1; l<=listError.Count;l++)
   {
    lbError.Items.Add("[" + l + "]" + listError[l - 1]);
   }本文引用通告地址: http://blog.csdn.net/lynn0821/services/trackbacks/469672.aspx 
[点击此处收藏本文] 

解决方案 »

  1.   

    回复: lynn0821(林子) 
    以@开头的字符串——这个想到了,@开头的字符串是在引号里吧,所以....
    字符串中的\转义字符——这个也有的
    问题想简单了,假设一个 @"string a=""\"";"    (相当于"string a=\"\\\";")
    你这个程序可就出问题了.
      

  2.   

    string s=@"string a=""\"";"
    检测结果为:string s = @"string a=""\""; "
    最后一个引号前多了个空格....
    正在解决...
      

  3.   

    恩,可能吧
    当时考虑到细节太多了,所以并没有想到怎么优化
    呵呵,谢谢楼上~我也已经解决了“ string s=@"string a=""\"";"检测结果为:string s = @"string a=""\""; "  ”这个问题,解决方案如下:
    if(arrLine[i][j] == '"')//遇到一个引号,同时它的前面一个不是"\"
    {
    if(arrLine[i][j - 1] != '\\')
    {
    iFlag++;//每遇到一个双引号,iFlag就加一
    }
    else if(iFlag == 1)
    {
    iFlag --;
    }
    }
    就是,如果遇到“\”这个情况时,如果\的后面是引号,而且之前已经有一个引号了(这里就是iFlag==1),必须把iFlag--
    可能还有别的问题,希望大家给给意见啊
      

  4.   

    做成macro或者addin或许更好用一些噢...
    如果你能提供macro版本,请给我一份.谢谢!!最好还能带一些其它的东东.添加代码文件头的备注等等.我有一个添加#region和自动格式化的addin.要的话也可以找我.
    kirc(at)yeah.net