'test'.match(/(e)/)
通常、配列を受け取るようなことをする['e', 'e']
と、最初の要素は一致自体であり、2番目の要素はセレクター(中括弧)からのものですが、グローバル修飾子を使用する'test'.match(/(e)/g)
と、一致は省略されますが、セレクターをまったく使用しない場合。
次の動作が指定されているかどうか、どこで指定されているのでしょうか(このテストではChromiumを使用)。
'test'.match(/(e)/)
通常、配列を受け取るようなことをする['e', 'e']
と、最初の要素は一致自体であり、2番目の要素はセレクター(中括弧)からのものですが、グローバル修飾子を使用する'test'.match(/(e)/g)
と、一致は省略されますが、セレクターをまったく使用しない場合。
次の動作が指定されているかどうか、どこで指定されているのでしょうか(このテストではChromiumを使用)。
グローバルフラグ(g)が設定されていない場合、配列の要素0には一致全体が含まれ、要素1からnには部分一致が含まれます。この動作は、グローバルフラグが設定されていない場合のexecメソッド(正規表現)(JavaScript)の動作と同じです。グローバルフラグが設定されている場合、要素0からnには、発生したすべての一致が含まれます。
http://msdn.microsoft.com/en-us/library/ie/7df7sf4x(v=vs.94).aspx
つまり、g
が提供されると、match
キャプチャグループを無視して、最上位の一致のみを収集します。
例:
> s = "Foo Bar"
"Foo Bar"
> s.match(/([A-Z])([a-z]+)/)
["Foo", "F", "oo"]
> s.match(/([A-Z])([a-z]+)/g)
["Foo", "Bar"]
Pythonのように、すべての一致からすべてのグループを収集する組み込み機能はありませんfindall
が、次を使用して簡単に記述できますexec
。
function matchAll(re, str) {
var p, r = [];
while(p = re.exec(str))
r.push(p);
return r;
}
matchAll(/([A-Z])([a-z]+)/g, "Foo Bar")
結果:
[
Array[3]
0: "Foo"
1: "F"
2: "oo"
index: 0
input: "Foo Bar"
length: 3
__proto__: Array[0]
,
Array[3]
0: "Bar"
1: "B"
2: "ar"
index: 4
input: "Foo Bar"
length: 3
__proto__: Array[0]
]
動作はECMAスクリプト言語仕様で指定されています。このセクションでは、グローバル修飾子がある場合とない場合の正規表現エンジンが実行する手順について詳しく説明します。
ポイント11で特定:If global is true,
Call the [[Put]] internal method of R with arguments "lastIndex", e, and true.