js String类replace函数

  
   下面任意的匹配变量都能用来识别最新的匹配以及找出匹配的字符串。在需要动态决定替换字符串的文本替换中可以使用匹配变量。

 

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都似曾见过,但是在网页特效函数实现的方法很新颖。新颖的地方就是在:

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),而我写的函数里面第二个参数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里面运行
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<j;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<j;i++)
        {
            console.log("标示newmyReplace" + i + ":" + arguments[i]);
        }
        return word = 'CJJK00';
    });
}

结果:
arguments.length:4
标示newformat0:%1
标示newformat1:1
标示newformat2:8
标示newformat3:And the %1 want to know whose %2 you %3
arguments.length:4
标示newformat0:%2
标示newformat1:2
标示newformat2:30
标示newformat3:And the %1 want to know whose %2 you %3
arguments.length:4
标示newformat0:%3
标示newformat1:3
标示newformat2:37
标示newformat3:And the %1 want to know whose %2 you %3
arguments.length:3
标示newmyReplace0:CJ90
标示newmyReplace1:0
标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765
arguments.length:3
标示newmyReplace0:CJ89
标示newmyReplace1:7
标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765
arguments.length:3
标示newmyReplace0:CJ12
标示newmyReplace1:14
标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765
arguments.length:3
标示newmyReplace0:CJ87
标示newmyReplace1:22
标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765

对于回调函数里的arguments值现在比较清晰了,arguments个数的不同应该和我们写的正则表达式有关系,不管怎样,第一个参数是匹配到的字符串,最后一个是原字符串,倒数第二个参数是匹配到的字符串的在原字符串索引的起始位,像format里的第二个参数index根据情况而定了,我自己写的newmyReplace里没有这个参数,format的index参数是%[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';
            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原始写法

时间: 2024-09-24 10:49:13

js String类replace函数的相关文章

javascript笔记 String类replace函数的一些事_javascript技巧

我最近查阅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]; });

c++中string类成员函数c_str()的用法_C 语言

1.string类成员函数c_str()的原型: const char *c_str()const;//返回一个以null终止的c字符串 2.c_str()函数返回一个指向正规c字符串的指针,内容和string类的本身对象是一样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式; 3.操作c_str()函数的返回值时,只能使用c字符串的操作函数,如:strcpy()等函数.因为,string对象可能在使用后被析构函数释放掉,那么你所指向的内容就具有不确定性.

js正则表达式之replace函数用法_正则表达式

正则表达式replace()函数: 此函数用指定的字符串替换字符串中与正则表达式匹配的子字符串. 返回值是一个替换后的新字符串. 这里只介绍正则表达式的相关操作,其他替换操作可以参阅javascript的String对象的replace()方法一文. 语法结构: stringObject.replace(regexp,replacement) 参数列表如下: 参数名称 语义解释 regexp 必需.RegExp对象. replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数

C++string类常用函数

string类的构造函数:string(const char *s);   //用c字符串s初始化string(int n,char c);   //用n个字符c初始化此外,string类还支持默认构造函数和复制构造函数,如string s1:string s2="hello":都是正确的写法.当构造的string太长而无法表达时会抛出length_error异常 string类的字符操作:const char &operator[](int n)const;const cha

js正则表达式之replace函数用法

正则表达式replace()函数: 此函数用指定的字符串替换字符串中与正则表达式匹配的子字符串. 返回值是一个替换后的新字符串. 这里只介绍正则表达式的相关操作,其他替换操作可以参阅javascript的String对象的replace()方法一文. 语法结构: stringObject.replace(regexp,replacement) 参数列表如下: 参数名称 语义解释 regexp 必需.RegExp对象. replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数

关于js中的Replace函数的简单疑问!

问题描述 function(s, c) { return s.replace(/{(w+)}/g, function(m, p) { return c[p]; })} 上面这个函数是什么意思啊? 解决方案 Javascript中的replace函数的第二个参数可以是函数.如果是函数,将会用该函数的返回值进行替换./{(w+)}/g 匹配所有 花括号中间的文字.比如a{b}c这样会匹配出b.你的代码中的那个c多半是个map或对象.说到这你可能明白了吧,是个参数替换的方法.下面是示例,看得清楚些.f

JavaScript String.replace函数参数实例说明_基础知识

Email:longsu2010 at yeah dot net js String的replace函数的函数签名如下: replace(match/* 字符串OR正则表达式 */, replacement/* 字符串OR函数 */) 作用是将源自符串中的match替换为replacement并返回替换后的字符串. 如果第一参数是字符串就没什么好说的了,但是要记住此时只在源自符串替换一次match(第一次)函数就执行完成了. 所以第一参数通常是一个正则表达式,举例如下: replace(/a/g

javascript String.replace函数

 代码如下 复制代码 stringObject.replace(regexp/substr,replacement) replacement 可以是字符串,也可以是函数.如果它是字符串,那么每个匹配都将由字符串替换.ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串.在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用.该函数的第一个参数是匹配模式的字符串.接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或

js中字符替换函数String.replace()使用技巧_javascript技巧

定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp/substr,replacement)参数 描述 regexp/substr 必需.规定子字符串或要替换的模式的 RegExp 对象. 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象.   replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数.