建议37:推荐使用replace(1)
String对象的replace方法包含两个参数,第一个参数表示执行匹配的正则表达式,也可以传递字符串,第二个参数表示准备代替匹配的子字符串,例如,把字符串html替换为htm。
- var b = s.replace("html", "htm" );
与search和match方法不同,replace方法不会把字符串转换为正则表达式对象,而是以字符串直接量的文本模式进行匹配。第二个参数可以是替换的文本,或者是生成替换文本的函数,把函数返回值作为替换文本来替换匹配文本。
replace方法同时执行查找和替换两个操作。该方法将在字符串中查找与正则表达式相匹配的子字符串,然后调用第二个参数值或替换函数替换这些子字符串。如果正则表达式具有全局性质,那么将替换所有的匹配子字符串,否则,只替换第一个匹配子字符串。
在replace方法中约定了一个特殊的字符“$”,如果这个美元符号附加了一个序号,就表示引用正则表达式中匹配的子表达式存储的字符串。例如:
- var s = "javascript";
- var b = s.replace( /(java)(script)/, "$2-$1");
- alert( b ); //"script-java"
在上面的代码中,正则表达式/(java)(script)/中包含两对小括号,按顺序排列,其中第一对小括号表示第一个子表达式,第二对小括号表示第二个子表达式,在replace方法的参数中可以分别使用字符串"$1"和"$2"来表示对它们匹配文本的引用,当然它们不是标识符,仅是一个标记,所以不可以作为变量参与计算。除了上面约定之外,美元符号与其他特殊字符组合还可以包含更多的语义,详细说明如下: - $1、$2、…、$99:与正则表达式中的第1~99个子表达式相匹配的文本。
- $&(美元符号+连字符):与正则表达式相匹配的子字符串。
- $`(美元符号+切换技能键):位于匹配子字符串左侧的文本。
- $'(美元符号+单引号):位于匹配子字符串右侧的文本。
- $$:表示$符号。
- var s = "javascript";
- var b = s.replace( /.*/, "$&$&"); //" javascriptjavascript "
由于字符串“$&”在replace方法中被约定为正则表达式所匹配的文本,因此利用它可以重复引用匹配的文本,从而实现字符串重复显示效果。其中正则表达式“/.*/”表示完全匹配字符串。 - var s = "javascript";
- var b = s.replace( /script/, "$& != $`"); //"javascript != java"
其中字符“$&”代表匹配子字符串“script”,字符“$`”代表匹配文本左侧文本“java”。 - var s = "javascript";
- var b = s.replace( /java/, "$&$' is "); //"javascript is script"
其中字符“$&”代表匹配子字符串“java”,字符“$'”代表匹配文本右侧文本“script”。然后用“$&$' is”所代表的字符串“javascript is”替换原字符串中的“java”子字符串,即组成一个新的字符串“javascript is script”。
在ECMAScript v3中明确规定,replace方法的第二个参数建议使用函数,而不是字符串(当然不是禁止使用),JavaScript 1.2实现了对这个特性的支持。这样,当replace方法执行匹配时,每次都会调用该函数,函数的返回值将作为替换文本执行匹配操作,同时函数可以接收以$为前缀的特殊字符组合,用来对匹配文本的相关信息进行引用。
- var s = 'script language = "javascript" type= " text / javascript"';
- var f = function($1){
- return $1.substring(0,1).toUpperCase() + $1.substring(1);
- }
- var a = s.replace( /(bw+b)/g, f );
- alert(a); //Script Language = "JavaScript" Type = " Text /JavaScript"
时间: 2024-10-10 05:30:59