2013年5月16日木曜日

String.prototype.replaceのコールバック関数

jsの String.prototype.replace メソッドは正規表現とコールバック関数を使った時、コールバック関数の引数が正規表現のマッチグループの数によって変わる。
知らなかったので、ちょっと試して確認した時のメモ

GoogleChrome バージョン 24.0.1312.52 で動作を確認したもの

ただの文字列:

1:マッチした部分
2:マッチしたインデックス
3:元の文字列全体

グループの無い正規表現:例 /[a-z]/

ただの文字列の場合と同じ

グループが1つの正規表現:例 /a([a-z])/

1:正規表現マッチした部分
2:マッチしたグループ部分
3:マッチしたインデックス
4:元の文字列全体
試したコード
"abcd".replace(/a([a-z])/, function(a,b,c){console.log(a,b,c);return a;});

グループが2つの正規表現:

1:正規表現にマッチした部分
2:マッチした1つ目のグループ部分
3:マッチした2つ目のグループ部分
4:マッチしたインデックス
5:元の文字列全体
試したコード
"abcd".replace(/a([a-z])([a-z])/, function(a){console.log(arguments);return a;});

グループが3つの正規表現:

マッチした部分の引数が増えて、インデックス・元の文字列全体が後ろにずれる。

まとめ

正規表現にgオプションを付けた場合も、それぞれのマッチ部分に対してそれぞれ上記同様にコールバック関数が呼ばれる。

仕様書を読むと、
第1引数:マッチした部分文字列
マッチグループ(captures)の数分の引数
マッチグループ(captures)の数+2番目の引数:マッチしたインデックス(マッチした文字列までのoffset)
マッチグループが無いなら第2引数。1つあれば第3引数。2つあれば第4引数。
マッチグループ(captures)の数+3番目の引数:元の文字列

MDNのページに大分詳しく載ってる。

参考

0 件のコメント: