Javascript regex.match有缺陷吗?

时间:2012-03-25 12:21:28

标签: regex firefox google-chrome

我保证你不是在说谎。这个用户脚本中有一个奇怪的行。其

if(rePrv.test(h)||rePrv.test(h))

现在,如果我只有if(rePrv.test(h)),我有时会得到错误(错误)。但是用||我得到了正确的结果。它吹我的大脑。到底是怎么回事?谁能解释一下?它发生在firefox 8,11(便携式)和chrome 17.0下。

这是我的用户代码。

// ==UserScript==
// @require         http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// ==/UserScript==

var re=/\/?docs\/\d+/gi;
var rePrv=/\/?docs\/\d+\/private/gi;
var prvls="";
var publs="";
$('a').each(function(i, e){
    var h = $(this).attr('href');
    if(h==undefined)
        return;
    if(re.test(h)){
        if(rePrv.test(h)||rePrv.test(h)){
            prvls+="http://www.domain.com/"+h+"<br/>\n";
        }
        else {
            publs+="http://www.domain.com/"+h+"<br/>\n";
        }
    }
});

1 个答案:

答案 0 :(得分:4)

RegExp的每个实例都有一个internal state,e。 G。 lastIndex指定开始下一场比赛的索引。如果您在exec内部使用test或其他任何使用exec的方法,则使用global matching时该状态可能会发生变化。因此,多次调用test可以在每次调用时获得不同的结果:

var str = 'foobar foobar';
var re = /foo/g;
alert(re.test(str) && re.lastIndex);  // re.lastIndex === 3
alert(re.test(str) && re.lastIndex);  // re.lastIndex === 10