\1是一个 反向引用匹配(3时候\1反向引用了 3
所以第一个是
macth==(33)
当然第2个匹配 是
匹配到\d时候 \1的反向引用匹配到一个3
所以有两次匹配

解决方案 »

  1.   

    var re = /\((\d)\1\)/gi; 
    var str = "12ab(33)c(4)"; 
    var arr = str.match(re); 
    match 是 String 的方法,exec 是 ReExp 对象的方法. 
    match 只返回匹配的第一项,exec 返回匹配的部分及子匹配项
      

  2.   

    while ((arr = re.exec(str))!= null) 仅循环了一次exec的返回值是一个数组[0] = lastMatch
    [1 - n] = RegExp.$[0-n]所以第二次的三就是第一个捕获即RegExp.$1
      

  3.   


    JScript   exec 方法
    See Also
    match 方法 | RegExp 对象 | 正则表达式对象方法 | 正则表达式对象属性 | 正则表达式语法 | search 方法 | test 方法应用于:正则表达式对象
    要求
    版本 3
    用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组。rgExp.exec(str)
    参数
    rgExp 
    必选项。包含正则表达式模式和可用标志的正则表达式对象。 
    str 
    必选项。要在其中执行查找的 String 对象或字符串文字。 
    说明
    如果 exec 方法没有找到匹配,则它返回 null。如果它找到匹配,则 exec 方法返回一个数组,并且更新全局 RegExp 对象的属性,以反映匹配结果。数组的0元素包含了完整的匹配,而第1到n元素中包含的是匹配中出现的任意一个子匹配。这相当于没有设置全局标志 (g) 的 match 方法。如果为正则表达式设置了全局标志,exec 从以 lastIndex 的值指示的位置开始查找。如果没有设置全局标志,exec 忽略 lastIndex 的值,从字符串的起始位置开始搜索。exec 方法返回的数组有三个属性,分别是 input、index 和 lastIndex。Input 属性包含了整个被查找的字符串。Index 属性中包含了整个被查找字符串中被匹配的子字符串的位置。LastIndex 属性中包含了匹配中最后一个字符的下一个位置。示例
    下面的例子举例说明了 exec 方法的用法:function RegExpTest(){
      var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())
      if (ver >= 5.5){                 // 测试 JScript 的版本。
        var src = "The rain in Spain falls mainly in the plain.";
        var re = /\w+/g;               // 创建正则表达式模式。
        var arr;
        while ((arr = re.exec(src)) != null)
           document.write(arr.index + "-" + arr.lastIndex + "\t" + arr);
      }
      else{
        alert("请使用 JScript 的更新版本");
      }
    }