Javascript regex.match неисправен? - PullRequest
3 голосов
/ 25 марта 2012

Обещаю, я не вру. В этом пользовательском скрипте есть одна странная строка. Его

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 Ответ

4 голосов
/ 25 марта 2012

Каждый экземпляр RegExp имеет внутреннее состояние , e.г.lastIndex, который указывает индекс, с которого начинается следующий матч.Если вы вызываете exec или любой другой метод, который использует exec внутренне, как test, это состояние может измениться при использовании глобального сопоставления .Поэтому, если вы звоните 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...