GM_xmlhttpRequestで取得してきたresponseTextの中から正規表現を使って複数抽出したい場合のなぞ

GM_xmlhttpRequestは関係無くてexecとmatchのgフラグに関するエントリー。


GM_xmlhttpRequestで取得してきたresponseTextの中から正規表現を使ってimgのsrcを抽出したいとき以下のようにすると思う。

/<img src\="(.+?)"/.exec(res.responseText);

でもこれだとマッチしたもの一個しか抽出してくれない。そういえば複数抽出したいときにはgフラグを付けるんだなと思い出して、gをつけても効果なし。

/<img src\="(.+?)"/g.exec(res.responseText);

なんでやねん。


あらかじめ抽出したいimgの個数がわかっていれば、以下のようにfor文でまわすとちゃんと抽出できた。

//5個ひろってこい
for(var i=0; i<5; i++){
  var h = /<img src\="(.+?)"/g.exec(res.responseText);
  console.log(h);
}

誰かexecの正しい使い方を教えてください。


matchでやってみたらfor文使わなくても抽出したものが配列になって出力してくれた。

  var h = res.responseText.match(/<img src\="(.+?)"/g);
  console.log(h);

リファレンス眺めてもexecとmatchは同じようにみえるけど違うのか。

正規表現が g フラグを含んでいる場合、マッチのすべてを含む 配列 (Array) を返します。
match - 詳細 - MDC

これかな。execはマッチ全文とマッチ分を出力するための使い捨て感覚か。文字列ならmatch使っておけか。微妙な使い分けが要求される。