日期:2014-05-16  浏览次数:20379 次

如何用正则表达式定位JS代码中尾部有多余逗号的对象?
   昨天跟同事一起检查IE下的JS错误,搞了几个小时,考虑了很多种可能,最后偶然发现问题的根源在于ContactList.js载入了ContactDisplay.js,而ContactDisplay.js中在postCreate函数里有这样一段代码
dojo.create("img", {
   src: "/html/themes/classic/images/contacts_pending.png",
}, this.pendingImg);
其中作为第二个参数的对象中多了一个逗号。

    这样的问题其实并不少见,对于比较简单的代码,比如:
var tt={
   name:"test",
   ff:"fdff”,
};
   Eclipse的JavaScript Editor会给出错误提示”Syntax error on token ",", LiteralField expected after this token”;当代码比较复杂,嵌套层次比较多时,如前面ContactDisplay.js中的情况,Eclipse的JavaScript Editor就没有给出提示。

    好在Eclipse中有用正则表达式进行搜索的功能,今天上午研究了一下,写了正则表达式来定位JS代码中尾部有多余逗号的对象。
    先介绍几个匹配注释的正则表达式:
用于匹配JS中的行注释: //[^\n]*\n
用于匹配JS中的块注释: /\*(.|\n)*?\*/
用于匹配JS中的任意注释: (//[^\n]*\n)|(/\*(.|\n)*?\*/)

     要匹配JS中尾部有多余逗号的对象,可用正则表达式:
          ,((\s*)|(//[^\n]*\n)|(/\*(.|\n)*?\*/))*}     
其中考虑了’,’和’}’之间有空白字符、行注释和块注释的情况。在Eclipse中用上面的正则表达式对较小的文件进行搜索是可以的,但对较长的文件搜索时,可能会报告"Find pattern too complex",非常郁闷。

    下面是几种稍微简单的情况,
只考虑,和}之间有空白字符的情况: ,\s*}
只考虑,和}之间有空白字符和行注释的情况: ,((\s*)|(//[^\n]*\n))*}
只考虑,和}之间有空白字符和块注释的情况: ,((\s*)|(/\*(.|\n)*?\*/))*}

    一种可行的解决方法是:先把JS中的块注释清除(用正则表达式替换功能将/\*(.|\n)*?\*/替换为空),然后只考虑,和}之间有空白字符和行注释的情况,即用 ,((\s*)|(//[^\n]*\n))*}  进行查找。

    对于有些JS在FF中正常运行,在IE下有错误的情况,如果JS文件比较长,用肉眼找起来很费事,并且怀疑是哪个对象多了个逗号的缘故,不妨在Eclipse打开源文件,用上面的方法搜搜看,也许能有意外发现哦。