代码之家  ›  专栏  ›  技术社区  ›  Pablo

javascript字符串执行奇怪行为

  •  3
  • Pablo  · 技术社区  · 14 年前

    有功能在我的对象,这是经常调用。

    parse : function(html)
    {
        var regexp = /...some pattern.../
        var match = regexp.exec(html);
        while (match != null)
        {
            ...
            match = regexp.exec(html);
        }
        ...
        var r = /...pattern.../g;
        var m = r.exec(html);
    }
    

    使用未更改的HTML m 互相返回空的调用。让我们说

    parse(html);// ok
    parse(html);// m is null!!!
    parse(html);// ok
    parse(html);// m is null!!!
    // ...and so on...
    

    是否有必须重置的索引或位置 html …我真的很困惑。为什么? match 总是返回正确的结果?

    2 回复  |  直到 13 年前
        1
  •  3
  •   Christian C. Salvadó    14 年前

    当您处理具有全局 g 标记,然后使用 exec test 方法。

    在这种情况下, RegExp 对象将跟踪 lastIndex 如果找到匹配项,然后在随后的匹配项中,将从该匹配项开始 最新索引 而不是从0开始。

    编辑: 为了回应你的评论, 为什么不 正则表达式 再次调用函数时正在重新创建的对象 :

    这是描述的行为 正则表达式文本 ,让我引用规范:

    § 7.8.5 - Regular Expression Literals

    对象在包含程序或函数的评估开始之前创建。文本的计算产生对该对象的引用;它不会创建新对象。

    您可以通过以下方式进行简单的证明:

    function createRe() {
      var re = /foo/g;
      return re;
    }
    
    createRe() === createRe(); // true, it's the same object
    

    您可以确定这是同一个对象,因为 “程序中的两个正则表达式文本的计算结果与从不将其与 === 即使两个文字的内容相同,也要相互交换。” ,例如:

    /foo/ === /foo/; // always false...
    

    但是,这种行为在所有浏览器上都受到尊重,而不是IE,它每次都初始化一个新的regexp对象。

        2
  •  1
  •   karora    13 年前

    为了避免这种情况下可能需要的行为,只需设置

    var r = /...pattern.../g;
    var m = r.exec(html);
    r.lastIndex=0;
    

    这对我有用。