2009-09-01 25 views
13

グローバルな結果を返さないことが、以下のこれらの行の3つのすべてが、その中に2件の結果を配列で返すべきであるというのが私の理解です。しかし、RegExpは正規表現が文字列内で何度繰り返されても1つの結果しか返しません。Javascriptの正規表現

いくつかのいずれかが理由を説明することはできますか? RegExpでどのようにグローバルな結果を得ることができるのでしょうか?

//INTPUT: 
    console.log(new RegExp("New York", "gi").exec("New York New York")); 

//OUTPUT: 
["New York"] 

//INTPUT: 
    console.log(new RegExp(/New York/gi).exec("New York New York")); 

//OUTPUT: 
["New York"] 

//INTPUT: 
    console.log("New York New York".match(/New York/gi)); 

//OUTPUT: 
["New York", "New York"] 
+0

は今、本当に私を陰謀何が(「ニューヨークニューヨーク」) 'しようということです.match(/ニューヨーク/ GI) 'それはちょっと予想通り(ちょうど1の結果をもたらすでしょう)、私はそれ以外の場合は、必要なときに(これを一周するより良い方法を考えることはできません)[それを反復以外](のhttp://のstackoverflow。コム/質問/ 42328875/javascriptの - 正規表現・ツー・削除 - すべての数字-と固有-な長さ-または-DO-永続的)! :( – cregox

答えて

20

あなたの第三の例は、マッチの配列を取得するための最良の方法です。

にregexp.execが実際にその位置を記憶し、後続の呼び出しに次の結果を返します:

>>> var v = /new york/gi 
>>> v.exec("NEW YORK new york") 
["NEW YORK"] 
>>> v.exec("NEW YORK new york") 
["new york"] 
>>> v.exec("NEW YORK new york") 
null 
+2

あなたは、これがARAYを自分で構築するために活用することができますが、それはちょうど私が私が文字列の出現回数のカウントを取得しようとしているキーワードの配列を持っているstring.match –

+0

を呼び出すために簡単です。何がベストですそれを行う方法? – StefanHayden

11

これは予想通り、exec()は1つの一致を返しますが、match()よりも多くの情報を提供します。すべてのマッチだけが必要な場合は、match()を使用します。 JavaScript: The Definitive Guideから:

(一致リコール)グローバル 定期expresionを通過したとき、マッチの配列 を返します。 EXEC()は、 対照的に、常に単一 一致を返し、その試合に関する完全 情報を提供します。 のexec()がgフラグを持つ正規 epression上で呼び出されたとき、それがマッチ ストリングのlastIndexプロパティを設定します。 EXEC()は同じ正規表現 ため 二回目呼び出されると、それは で lastIndexプロパティによって示された文字位置を検索を開始します。