js exec方法详解

  今天查看jquery源码的时候突然被exec方法给弄懵了,特意翻了翻资料详细了解了下。

  1、定义

  exec() 方法用于检索字符串中的正则表达式的匹配。

  使用方法:var match = RegExpObject.exec(string);

  这里主要是看返回值match。

  下面是摘自w3school中的解释:

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

  也就是说,exec返回的结果为一个数组。

  2、实例

  下面结合jquery中的源码对exec的返回结果做一说明:

   var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/;

   var match = quickExpr.exec( selector );
    //选择器类似h1的情形       
    if ( match && (match[1] || !context) ) {
         //如果选择器是h1这样的标签
        if ( match[1] ){
   
        }
        else {   
        var elem = document.getElementById( match[3] );
        }
    }    

  quickExpr中包含三个子表达式:(<(.|\s)+>),(.|\s),([\w-]+)。 

  match为一个数组,

  match[0]: 正则表达式要匹配的字符串,即selector

  match[1]: 与第一个子表达式匹配的文本,如果selector='<h1>hi';  则 match[1]='<h1>';

  match[2]:与第二个子表达式匹配的文本, 如果selector='<h1>hi';  则 match[2]='1';  第二个子表达式(.|\s)匹配包含字符或空格的字符串

  match[3]:与第三个子表达式匹配的文本,如果selector='#h1';则match[3]='h1';  这也就是为什么上面可以用document.getElementById( match[3] )获取dom元素的原因了。

 

 

 

posted @ 2013-02-21 11:44  Johnny.Chen  阅读(1665)  评论(0编辑  收藏  举报