2011-01-14 8 views
5

今日、私は非常に奇妙なJavaScriptの正規表現の問題を発見しました。グローバル修飾子(// g)を使用すると、RegExp.test()は後続の呼び出しで異なる値を返します。なぜ誰かが説明できますか?JavaScriptのRegExpが呼び出し間で状態を維持するのはなぜですか?

var s = "youtube.com/watch?v=XyeebVA3DNk"; 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 

var re2 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/; 

console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 

これをChrome 8とFireFox 3.6で再現できます。

答えて

7

gフラグを使用した場合のみです。私はそれが最高のデザインではないことに同意しますが、重要なことは、あなたが試合をループすることです。 re1.execとなります。

var s = "fo1,fo2,fo3,"; 
var re1 = /fo\d,/g; 
var match; 
while(match = re1.exec(s)) 
{ 
    alert(match); 
} 
2

グラム 『フラグ「あなたの正規表現が使用されている場合』には、同じ文字列での連続したマッチを見つけるために、execメソッドを複数回使用することができます。この操作を行うと、検索はのサブから始まりますsは、正規表現のlastIndexプロパティで指定します(testはlastIndexプロパティも進めます)。

"exec(またはそれと組み合わせて)と同じように、同じグローバル正規表現インスタンスで複数回呼び出されたテストは、以前の一致より前に進みます。

var s = "youtube.com/watch?v=XyeebVA3DNk"; 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 
関連する問題