javascript筆記String類replace関数のいくつかのこと

5746 ワード

私は最近javascript資料を調べて、関数を見つけました.
 
  
function format(s)
{
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])","g");
return String(s).replace(pattern,function(word,index){
return args[index];
});
}
// test
window.onload = alert(format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear"));
//And the papers want to know whose shirt you wear
このような機能の関数は、shellやjavaで見たことがあるようですが、javascript関数で実現する方法はとても新鮮です.新しいところはここです.
 
  
return String(s).replace(pattern,function(word,index){
return args[index];
});
しかしここではString類のreplaceの使い方は私が普段使っているのとはかなり違っています.以前にこのようなreplaceの関数を書いたことがあります.
 
  
function myReplace(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word){
return word = 'CJJK00';
});
}
//window.onload = alert(myReplace('CJ9080,CJ8976,CJ12919,CJ8765'));//CJJK0080,CJJK0076,CJJK00919,CJJK0065
私はreplaceを使う時、第二のパラメータがfunctionなら、普通は第一のパラメーターしか使わないです.第二のパラメーター、第三のパラメーター或いはもっと多いパラメーターを考えていません.今は第二のパラメーターを使っている人を見ました.replaceの第二のパラメーターがfunctionに使われた時、中のパラメーターはどれぐらいありますか?
以下は自分で書いた代替関数を書き換えました.
 
  
function myReplaceFtn(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word,index){
return word = 'CJJK00@' + index + "@";
});
}
//window.onload = alert(myReplaceFtn('CJ9080,CJ8976,CJ12919,CJ8765'));//CJJK00@0@80,CJJK00@7@76,CJJK00@14@919,CJJK00@22@65
本来は、関数formatのfunction(word,index)は、正規表現にマッチする文字列のインデックスであるべきだと思いますが(%1のインデックスは1、%2のインデックスは2、%3のインデックスは3)、私が書いた関数の中で2番目のパラメータindexは文字列にマッチするインデックスではなく、元の文字列の位置にマッチする文字です.次はこのようなテストをしました.
 
  
function format(s)
{
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])","g");
return String(s).replace(pattern,function(word,index){
alert("arguments.length:" + arguments.length);//4
return args[index];
});
}
function myReplaceFtn(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word,index){
alert("arguments.length:" + arguments.length);//3
return word = 'CJJK00@' + index + "@";
});
}
関数formatにはfunctionのパラメータが4つありますが、関数myReplacceFtnにはfunctionのパラメータが3つあります.なぜこのような違いがありますか?次のようなテストをしました.
 
  
// firefox
function newformat(s)
{
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])","g");
return String(s).replace(pattern,function(word,index){
console.log("arguments.length:" + arguments.length);
for (var i = 0,j = arguments.length;i{
console.log(" newformat" + i + ":" + arguments[i]);
}
return args[index];
});
}
function newmyReplace(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word){
console.log("arguments.length:" + arguments.length);
for (var i = 0,j = arguments.length;i{
console.log(" newmyReplace" + i + ":" + arguments[i]);
}
return word = 'CJJK00';
});
}
結果:
argments.length:4
newformat 0を表示:%1
表示newformat 1:1
表示newformat 2:8
newformat 3を表示します.And the%1 want to know whose%2 you%3
argments.length:4
表示newformat 0:%2
表示newformat 1:2
表示newformat 2:30
newformat 3を表示します.And the%1 want to know whose%2 you%3
argments.length:4
表示newformat 0:%3
newformat 1:3を表示します.
表示newformat 2:37
newformat 3を表示します.And the%1 want to know whose%2 you%3
argments.length:3
表示newmyReplace 0:CJ 90
表示newmyReplace 1:0
表示newmyReplace 2:CJ 9080、CJ 8976、CJ 12919、CJ 8765
argments.length:3
表示newmyReplace 0:CJ 89
表示newmyReplace 1:7
表示newmyReplace 2:CJ 9080、CJ 8976、CJ 12919、CJ 8765
argments.length:3
表示newmyReplace 0:CJ 12
表示newmyReplace 1:14
表示newmyReplace 2:CJ 9080、CJ 8976、CJ 12919、CJ 8765
argments.length:3
表示newmyReplace 0:CJ 87
表示newmyReplace 1:22
表示newmyReplace 2:CJ 9080、CJ 8976、CJ 12919、CJ 8765
フィードバック関数のargments値については、現在比較的はっきりしています.argments個数の違いは、私たちが書いた正規表現と関係があります.いずれにしても、最初のパラメータはマッチした文字列で、最後の一つは元の文字列で、最後の二つ目のパラメータは元の文字列索引の開始位置にマッチしています.formatの中の第二パラメータindexは状況によって決められました.自分で書いたnewmyReplaceにはこのパラメータがありません.formatのindexパラメータは%です.中の1-4はやはり書き込み方法で確定します.
 
  
function charFormat(s)
{
var pattern = new RegExp("%([a-d])","g");
return String(s).replace(pattern,function(word,index){
switch(index)
{
case 'a':
return 'thisisA';
case 'b':
return 'thisisB';
case 'c':
return 'thisisC';
case 'd':
return 'thisisD';
default:
return 'thisisNULL';
}
});
}
window.onload = console.log(charFormat("And the %a want to know whose %d you %b", "papers", "shirt", "wear"));
//And the thisisA want to know whose thisisD you thisisB
このようにStringのreplaceはかなり強いですが、本人の正則表現はまだ力が足りないので、他に何か特別な正則表現がありますか?また、誰がjavascriptの中にString類replaceというオリジナルの書き方があるか分かりません.貢献したいです.よく研究してみたいです.