2012-03-25 15 views
3

私はあなたに嘘をつかないと約束します。このユーザースクリプトには1つの奇妙な行があります。私はif(rePrv.test(h))を持っている場合は、そのJavascript regex.matchに問題がありますか?

if(rePrv.test(h)||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"; 
     } 
    } 
}); 

答えて

4

RegExpの各インスタンスはinternal state、Eを有しています。 g。 lastIndexは、次の一致を開始するインデックスを指定します。 execに電話するか、またはのように内部で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 
+0

でも、それでもf'dです。私は再現可能なものを得ようとしています。これは...混乱している。 –

+0

@ acidzombie24再現可能です。 – Gumbo

+0

@ acidzombie24、 '/ g'を削除してください。なぜあなたはそこにそれを持っていますか? – Qtax

関連する問題