【JavaScript】replaceで、キャプチャ番号ごとに別々の処理を行いたい

replaceで、置換の方法をコールバック関数に記述する場合、
キャプチャ番号ごとに別々の処理を行うにはどうすればいいか。


var str = 'abc';
str = str.replace(/(a)|(b)|(c)/g,
function(){
//コールバック関数
}
);
コールバック関数に、キャプチャされるグループの数+1だけ
引数を用意しておいてもいいのですが、

function(arg0, arg1, arg2, arg3){
if(arg3){
return 'c!'; //cに対する処理
}else if(arg2){
return 'b!'; //bに対する処理
}else{
return 'a!'; //aに対する処理
}
}
//arg0にはマッチした文字列全体が格納される
argumentsを使ったほうが楽ちんです。

function(){
if(arguments[3]){
return 'c!'; //cに対する処理
}else if(arguments[2]){
return 'b!'; //bに対する処理
}else{
return 'a!'; //aに対する処理
}
}
キャプチャ番号ごとに異なる文字装飾をしたい場合を
例にすると、全体のコードは以下のように。

<head>
<script type="text/javascript">
window.onload = function(){
var str = 'abc';
str = str.replace(/(a)|(b)|(c)/g,
function(){
if(arguments[3]){
return '<b>'+arguments[3]+'</b>';
}else if(arguments[2]){
return '<i>'+arguments[2]+'</i>';
}else{
return '<strike>'+arguments[1]+'</strike>';
}
}
);
document.getElementById('box').innerHTML = str;
};
</script>
</head>
<body>
<div id="box"></div>
</body>