最近 JavaScript 情報をチェックして関数を見つけました:
関数の形式
{
var args = 引数;
var pattern = new RegExp("%([1-" argument.length "])","g"); 🎜>return String (s).replace(pattern,function(word,index){
return args[index];
});
}
// テスト
window.onload =alert(format ("そして、%1 はあなたが %2 の誰を着ているかを知りたがっています", "papers", "shirt", "wear")); そして、新聞はあなたが誰のシャツを着ているかを知りたがっています。
このような機能を持つ関数はシェルやJavaではこれまでにも見られましたが、それをJavaScriptの関数で実装する方法は非常に斬新です。
return String(s) . replace(pattern,function(word,index){
return args[index];
});
しかし、ここでの String クラスでの replace の使用法は大きく異なります。同様に、以前に次のような置換関数を作成しました。
{
return String(s).replace(/CJ[0-9]{2}/g,function(word){
return word = 'CJJK00'});
}
//window.onload = warning(myReplace('CJ9080,CJ8976,CJ12919,CJ8765'));///CJJK0080,CJJK0076,CJJK00919, CJJK0065
replace を使用するとき、2 番目のパラメーターが関数の場合、通常は最初のパラメーターのみを使用し、2 番目、3 番目、またはそれ以上のパラメーターについては基本的に考えません。 2 番目のパラメータについては、パラメータがいくつあるのか、関数で replace の 2 番目のパラメータが使用される場合、それぞれの意味は何なのかを知りたいのです。
以下は私が自分で書いた置換関数です:
コードをコピーします
return String(s).replace(/CJ[0-9]{2}/g,function(word,index){
return word = ' CJJK00@' インデックス "@";
}
//window.onload =alert(myReplaceFtn('CJ9080,CJ8976,CJ12919,CJ8765'));//CJJK00@0 @80 ,CJJK00@7@76,CJJK00@14@919,CJJK00@22@65
本来は関数形式の関数(word,index)を正規表現にすべきだと思っていました一致する文字列のインデックス (%1 のインデックスは 1、%2 のインデックスは 2、%3 のインデックスは 3)、私が作成した関数の 2 番目のパラメーターのインデックスは、一致した文字列ですが、元の文字列内の一致した文字の位置です。以下では、次のようなテストを行いました。
コードをコピー
var pattern = new RegExp("%([1-" argument.length "])","g"); (s) .replace(pattern,function(word,index){
alert("arguments.length:" argument.length);//4
return args[index];
}); 🎜>}
function myReplaceFtn(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word,index){
alert ("arguments .length:" argument.length);//3
return word = 'CJJK00@' インデックス "@"
}
関数関数内部の形式 関数 myReplaceFtn(s) には (word, Index) のパラメーターが 4 つあり、関数 (word, Index) のパラメーターが 3 つあります。なぜこのような違いがあるのでしょうか?次のテストを行いました:
コードをコピー
コードは次のとおりです:
console.log("arguments.length:" argument.length);
for (var i = 0,j = argument.length;i
{
console.log("mark newformat" i ":" argument[i]);
}
return args [インデックス];
});
}
関数 newmyReplace(s)
{
return String(s).replace(/CJ[0-9]{2}/g, function(word){
console.log("arguments.length:" argument.length);
for (var i = 0,j = argument.length;i{
console.log ("mark newmyReplace" i ":" argument[i]);
}
return word = 'CJJK00'
}
結果:
arguments.length:4
Mark newformat0: %1
Mark newformat1: 1
Mark newformat2: 8
Mark newformat3: そして、%1 は誰の % かを知りたい2 あなた %3
arguments.length:4
Mark newformat0: %2
Mark newformat1: 2
Mark newformat2: 30
Mark newformat3: そして、%1 は誰の %2 を知りたいですかあなた %3
arguments.length:4
mark newformat0: %3
mark newformat1: 3
mark newformat2: 37
mark newformat3: そして、%1 はあなたが誰の %2 かを知りたいと思っています%3
arguments.length:3
Mark newmyReplace0: CJ90
Mark newmyReplace1: 0
Mark newmyReplace2: CJ9080,CJ8976,CJ12919,CJ8765
arguments.length:3
Mark newmyReplace0 :cj89
Mark NewMyreplace1:7
Mark NewMyreplace2:CJ9080、CJ8976、CJ12919、CJ8765
引数.length:3
Mark NewMyreplace0:CJ12 arguments.length:3
Mark newmyReplace0: CJ87
Mark newmyReplace1: 22
Mark newmyReplace2: CJ9080,CJ8976,CJ12919,CJ8765
コールバック関数引数の値がより明確になりました。引数の数の違いは、作成した正規表現に関連しているはずです。いずれの場合も、最初のパラメータは一致した文字列、最後のパラメータは一致した文字列です。 string は元の文字列インデックスの開始位置にあります。format の 2 番目のパラメータのインデックスと同様に、newmyReplace にはそのようなパラメータはありません。format のインデックス パラメータは %[1-4 ] です。 , 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 ';
ケース 'c':
'thisisC';
'thisisD' を返す:
'thisisNULL'; }
});
}
window.onload = console.log(charFormat("そして、%a は、あなたが %d の誰を知りたいと思っています", "書類", "シャツ", "着ています")) ;
//そして、thisisA 誰の thisisD あなた thisisB を知りたい
String の置換は非常に強力であることがわかりますが、私の正規表現スキルが十分ではありません。他に何があるかわかりません。異なる結果を生成する他の特別な正規表現は何ですか?また、JavaScript での String クラス replace の独自の記述方法を持っている人がいるかどうかはわかりませんので、注意深く研究していきたいと思います。