JavaScriptRegExp
オブジェクトはステートフルです。
正規表現がグローバルである場合、同じ正規表現オブジェクトでメソッドを呼び出すと、最後の一致の終わりを過ぎたインデックスから開始されます。
一致するものがなくなると、インデックスは0
自動的にリセットされます。
手動でリセットするには、lastIndex
プロパティを設定します。
reg.lastIndex = 0;
これは非常に便利な機能です。必要に応じて、文字列の任意の時点で評価を開始できます。ループ内の場合は、必要な数の一致後に評価を停止できます。
これは、ループで正規表現を使用するための一般的なアプローチのデモンストレーションです。ループ条件として割り当てを実行することにより、一致がなくなったときにexec
戻るという事実を利用します。null
var re = /foo_(\d+)/g,
str = "text foo_123 more text foo_456 foo_789 end text",
match,
results = [];
while (match = re.exec(str))
results.push(+match[1]);
デモ:http: //jsfiddle.net/pPW8Y/
割り当ての配置が気に入らない場合は、たとえば次のようにループを作り直すことができます...
var re = /foo_(\d+)/g,
str = "text foo_123 more text foo_456 foo_789 end text",
match,
results = [];
do {
match = re.exec(str);
if (match)
results.push(+match[1]);
} while (match);
デモ:http: //jsfiddle.net/pPW8Y/1/