2012-03-26 6 views
4

私はanother questionを持っていたし、それは私は正規表現がw3schoolsから、それがRegex Javascript // gフラグが状態に影響するのはなぜですか?

ある方法に影響を与えている理由を理解いけない答えましたが、それは

グラムを言う:グローバルマッチ(すべてのマッチを見つけるのではなく後に停止を行います最初の試合)

確認してください。わかりました。私はこのコードで配列を取得Thatsなぜ

var str="The rain in SPAIN stays mainly in the plain"; 
var patt1=/ain/gi; 
document.write(str.match(patt1)); 

出力:

ain,AIN,ain,ain 

正規表現は、それが複数のインスタンスを置き換えます/gで、似ています。

しかし試合

var re=/hi/gi; 
alert(re.test("hi") + " " + re.test("hi")); 

での結果は "偽真" です。

なぜ$%^ &になるのですか?両方のテストの文字列はまったく同じです!過去に私は、グローバルでは、改行(これは私がこのテストでやりたかったことです)を検索することを意味すると思っていました。私が引用した最初のことは、gがグローバルマッチであることでした。

NEXT CALLに影響を及ぼすことについて何も言及していません!/gを指定しなくてもコードは正しく動作します(改行を渡す必要はありません)。なぜ次のテストに影響しますか? gumboの答えは、lastIndexに影響を及ぼしていると言いますが、gフラグを使用している間は他の2つの関数が使用されていないので、%^ & *は共有状態が分かりませんでした。私は真実と偽を欲しかっただけですが、もし一致するものがなければ、それは世界的に見出されたマッチの量を含むintを返すでしょうか? (すなわち、 "hi"では1、文字列 "hihi"では2)。

regex.testを実行しているときに、次の呼び出しに影響を与えるのはなぜですか?また、できる場合は、私は実際にその '機能'をしたいときに提供

+0

w3schoolsは信頼できません。詳細については、[w3fools](http://w3fools.com)を参照してください。あなたのJS情報をどこにでも持っているなら、[MDN](https://developer.mozilla.org/)から入手してください。 – zzzzBov

+0

@zzzzBov私は過去に「javascript」マニュアルを見つけようとしましたが、mdn bcとは考えていませんでした。 ok私は次回にそこに点検する! –

+0

@ acidzombie24、究極のリペアのために、PDFとしてダウンロード可能なECMAscript仕様を使用してください。はい、クイックリファレンスとして使用するのは面倒ですが、それは権威あるガイドです!しかし、zzzzBovによると、MDNはおそらく最初のコールオブコールです。 – Doin

答えて

9

正規表現でグローバルフラグを使用すると、lastIndexプロパティが更新されます。 lastIndexプロパティは、次の一致を開始するインデックスです。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp

あなたは再び呼び出す前に最後のインデックスをリセットすることができます。私には

Why RegExp with global flag in Javascript give wrong results?

+0

大丈夫ですが、lastIndex(説明はほとんどありません)とexecについては言及していますが、その動作を持つグローバルについて言及していません。 Theresはなぜそれがその行動を持っているか、または私がそれを使用することができる何の明白な理由もありません。 -edit-どこでもlastIndexとglobalの両方を言及していません。そのような行動は完全に文書化されていません! –

+0

リンクされたSOの質問に関するコメントを読むと、 "これは仕様が規定するものなので、設計の選択です。これはすべてECMAScript 3仕様のセクション15.10.6.2にあります。 –

+0

それは本当にデザインの理由について話しません。私はあなたの実装exec(私は今のところ使用していない)が理にかなっているかと思います。しかし、私はここでテストを使用しています。私は...特にマッチと交換がそれを持っていないように見えるときにその行動を期待していません。あなたがECMAScript3の仕様はナンセンスだと思うが、+ 1 bcあなたは質問に答えた。 –

0

を参照してください、主な問題は、あなたが「G」修飾子の代わりに、基本的にマッチした文字のセットに「\ n」を追加「M」修飾子を使用しているということのようです'。'

与えられたマッチについて反復したい場合は、 'g'修飾子を使用します。http://perldoc.perl.org/perlretut.html#Using-regular-expressions-in-Perlを参照してください(そのページで「グローバルマッチング」を検索してください)。これはPerlのドキュメントですが、ユースケースの良い例があります。

alert(re.test(new String("hi")) + " " + re.test(new String("xhi"))); 

はあなたが記載された結果が得られているため。Javascriptの実装はまだ、私の知る限り見ることができるように欠陥がありますしかし、今では、2つの文字列は異なるオブジェクトであり、それらはreのインデックスをリセットするはずの異なる値を持っていますが、明らかにそれはありませんでした。