知らなかったので、ちょっと試して確認した時のメモ
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のページに大分詳しく載ってる。
参考
- Standard ECMA-262 : 15.5.4.11 String.prototype.replace (searchValue, replaceValue)
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=157 - Java regex tester
http://java-regex-tester.appspot.com/ - replace - JavaScript | MDN
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace
0 件のコメント:
コメントを投稿