Javascript使用replace函数格式化字符串
我最近查阅javascript资料,发现了一个函数:
1 function format(s) 2 { 3 var args = arguments; 4 var pattern = new RegExp("%([1-" + arguments.length + "])","g"); 5 return String(s).replace(pattern,function(word,index){ 6 return args[index]; 7 }); 8 } 9 10 // test 11 12 window.onload = alert(format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear")); 13 14 //And the papers want to know whose shirt you wear
这种功能的函数,在shell或java都似曾见过,但是在javascript函数实现的方法很新颖。新颖的地方就是在:
1 return String(s).replace(pattern,function(word,index){ 2 return args[index]; 3 });
但是这里String类的replace的用法和我平时用的很不一样,我以前写过一个这样的replace的函数:
1 function myReplace(s) 2 { 3 return String(s).replace(/CJ[0-9]{2}/g,function(word){ 4 return word = 'CJJK00'; 5 }); 6 } 7 //window.onload = alert(myReplace('CJ9080,CJ8976,CJ12919,CJ8765'));//CJJK0080,CJJK0076,CJJK00919,CJJK0065
我在使用replace时候,如果第二个参数是function我一般都只用到第一个参数,基本没有思考它的第二个,第三个或者更多的参数,现在看到有人使用了第二个参数,就很想探求下replace第二个参数使用到了function时候,里面参数到底有多少个,每个的含义到底如何?
下面是我改写了我自己写的替换函数:
1 function myReplaceFtn(s) 2 { 3 return String(s).replace(/CJ[0-9]{2}/g,function(word,index){ 4 return word = 'CJJK00@' + index + "@"; 5 }); 6 } 7 //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),而我写的函数里面第二个参数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(word,index)的参数有4个,而函数myReplaceFtn(s)里面function(word,index)的参数有3个。为什么会有这样的不同?我做了如下测试:
//以下程序在firefox里面运行
1 function newformat(s) 2 { 3 var args = arguments; 4 var pattern = new RegExp("%([1-" + arguments.length + "])","g"); 5 return String(s).replace(pattern,function(word,index){ 6 console.log("arguments.length:" + arguments.length); 7 for (var i = 0,j = arguments.length;i<j;i++) 8 { 9 console.log("标示newformat" + i + ":" + arguments[i]); 10 } 11 return args[index]; 12 }); 13 } 14 15 function newmyReplace(s) 16 { 17 return String(s).replace(/CJ[0-9]{2}/g,function(word){ 18 console.log("arguments.length:" + arguments.length); 19 for (var i = 0,j = arguments.length;i<j;i++) 20 { 21 console.log("标示newmyReplace" + i + ":" + arguments[i]); 22 } 23 return word = 'CJJK00'; 24 }); 25 } 26 结果: 27 arguments.length:4 28 标示newformat0:%1 29 标示newformat1:1 30 标示newformat2:8 31 标示newformat3:And the %1 want to know whose %2 you %3 32 arguments.length:4 33 标示newformat0:%2 34 标示newformat1:2 35 标示newformat2:30 36 标示newformat3:And the %1 want to know whose %2 you %3 37 arguments.length:4 38 标示newformat0:%3 39 标示newformat1:3 40 标示newformat2:37 41 标示newformat3:And the %1 want to know whose %2 you %3 42 arguments.length:3 43 标示newmyReplace0:CJ90 44 标示newmyReplace1:0 45 标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765 46 arguments.length:3 47 标示newmyReplace0:CJ89 48 标示newmyReplace1:7 49 标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765 50 arguments.length:3 51 标示newmyReplace0:CJ12 52 标示newmyReplace1:14 53 标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765 54 arguments.length:3 55 标示newmyReplace0:CJ87 56 标示newmyReplace1:22 57 标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765
对于回调函数里的arguments值现在比较清晰了,arguments个数的不同应该和我们写的正则表达式有关系,不管怎样,第一个参数是匹配到的字符串,最后一个是原字符串,倒数第二个参数是匹配到的字符串的在原字符串索引的起始位,像format里的第二个参数index根据情况而定了,我自己写的newmyReplace里没有这个参数,format的index参数是%[1-4],里面的1-4,不过还是写个方法确定下:
1 function charFormat(s) 2 { 3 var pattern = new RegExp("%([a-d])","g"); 4 return String(s).replace(pattern,function(word,index){ 5 switch(index) 6 { 7 case 'a': 8 return 'thisisA'; 9 case 'b': 10 return 'thisisB'; 11 case 'c': 12 return 'thisisC'; 13 case 'd': 14 return 'thisisD'; 15 default: 16 return 'thisisNULL'; 17 } 18 }); 19 } 20 21 window.onload = console.log(charFormat("And the %a want to know whose %d you %b", "papers", "shirt", "wear")); 22 23 //And the thisisA want to know whose thisisD you thisisB
由此可见String的replace是相当的强大,不过本人正则表达式功力还不够,不知道还有什么别的特别的正则表达式会产生什么不同的结果。另外不知道谁有javascript里面String类replace原始写法,希望能贡献出来,我想好好研究下
声明:这篇文章是我之前转载之后保留下来的,原文的出处记不清楚了,如果原文作者是你,你可以联系我caimeng1013@126.com我可以给你加上链接。