JavaScript で while(/([^=]+)=([^,]+),?/g) {〜} 相当のコードを書くには?
以下のような感じで replace メソッドの第2引数に文字列の代わりにコールバック関数を書けば良い。
function foo() { var ret = RegExp.$1 + '=' + RegExp.$2; alert(ret); return ret; } str = 'a=1,b=2,c=3'; str.replace(/([^=]+)=([^,]+),?/g, foo);
ちなみにコールバック関数の戻り値が置換結果として利用される。
但し、このコードはFirefoxやOperaでは動くけどIEでは動かないようだ。
IEでは RegExp.$1 とかには空文字になってしまうのでマルチブラウザを考えたらこの書き方は戴けない。
マルチブラウザ対応のコード
色々試した結果、マルチブラウザ対応するには RegExp ではなく arguments を使えばよさそうだ。
というわけで以下のようなコードで確認してみた。うん行けそう。
function foo() { m='|'; for(i = 0; i < arguments.length; i++) { m += arguments[i] + '|'; } alert(m); } str = 'a=1,b=2,c=3'; str.replace(/([^=]+)=([^,]+),?/g, foo);
この結果は以下のようになる。
|a=1,|a|1|0|a=1,b=2,c=3| |b=2,|b|2|4|a=1,b=2,c=3| |c=3|c|3|8|a=1,b=2,c=3|
これを見る限りargumentsの中身は頭から順に
- マッチした文字列
- $1
- $2
- :
- 見つかった位置
- 全体の文字列
となるぽい。
この結果はどのブラウザでも同一のモノが得られた。