16

以下の 3 つの行はすべて、2 つの結果を含む ARRAY を返す必要があることを理解しています。それでも、正規表現が文字列内で何回繰り返されても、RegExp は 1 つの結果しか返しません。

誰かが理由を説明できますか?そして、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"]
4

2 に答える 2

25

3 番目の例は、一致の配列を取得する最良の方法です。

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
于 2009-09-01T15:05:54.780 に答える
13

これは予期されることです。exec() は 1 つの一致を返しますが、一致に関するより多くの情報を提供します。すべての一致が必要な場合は、match() を使用します。JavaScriptから: The Definitive Guide :

グローバル正規表現が渡されると、 match() は一致の配列を返すことを思い出してください。対照的に、exec() は常に 1 つの一致を返し、その一致に関する完全な情報を提供します。g フラグを持つ正規表現で exec() が呼び出されると、一致した部分文字列の lastIndex プロパティが設定されます。exec() が同じ正規表現に対して 2 回目に呼び出されると、lastIndex プロパティによって示される文字位置から検索が開始されます。

于 2009-09-01T15:04:16.733 に答える