Regex / lastIndex - 意外行为

时间:2009-10-07 20:45:54

标签: javascript regex

我知道有一些正则表达式/ lastIndex 差异,但这个对我来说是新的!

预期的行为:显然,创建一个新的正则表达式(使用文字/构造函数)将创建一个新的RegExp对象,其 lastIndex 属性设置为零。

实际行为 :(在FF,Chrome中):lastIndex属性似乎在多个RegExp创建中持续存在。

E.g。

function foo(s) {

    // A *NEW* regular expression
    // is created on each call of foo():
    var regex = /ABC/g;

    document.write( regex.lastIndex + '<br/>' );

    // regex.test() updates lastIndex property
    regex.test(s);

    // This is where the regex's life should end...
    // (Why does it persist?)

}

foo('ABC');
foo('ABCABC');
foo('ABCABCABC');

请参阅此处: http://jsbin.com/otoze


正在为每个函数调用创建一个新的RegExp对象(对吗?),为什么以下内容被写入文档? -

0
3
6

???

请注意,这种奇怪现象似乎发生在FF(3)和Chrome(2)中,但奇怪的是不是IE。

这是预期的行为,IE是错误的还是对的?这是一个众所周知的错误吗?


编辑:当使用构造函数而不是文字实例化正则表达式时,似乎不会发生这种情况。例如。 new RegExp('ABC','g'); ......但是,文字应该(理论上)有效吗?

2 个答案:

答案 0 :(得分:5)

var regex = new RegExp("ABC", "g");没有这个问题,所以我猜/ABC/g重新使用正则表达式对象。

编辑:显然这是根据ECMAScript 3.0规范的正确行为,它已在ECMAScript 3.1中修复 - details

答案 1 :(得分:1)

试试这个:

function foo(s) {

    // A *NEW* regular expression
    // is created on each call of foo():
    var regex = new RegEx("ABC", "g");

    document.write( regex.lastIndex + '<br/>' );

    // regex.test() updates lastIndex property
    regex.test(s);

    // This is where the regex's life should end...
    // (Why does it persist?)

}

foo('ABC');
foo('ABCABC');
foo('ABCABCABC');