14.2.6 替换文本
我们也可以使用正则表达式来替换一个字符串中的文本。例如,假设有一个字符串,它包含了类似10.28.2008格式的一个日期。然而,我们想要的日期格式是10/28/2008。replace()方法可以做到这点。它的形式如下:
string.replace(regex,'replace');
replace()方法接收两个参数:第一个参数是要在字符串中搜索的一个正则表达式;第二个参数是要替换这个正则表达式的一个字符串。因此,要将格式从10.28.2008修改为10/28/2008,我们可以这样做:
1 var date=’10.28.2008’;//a string
2 var replaceRegex=/./g//a regular expression
3 var date=date.replace(replaceRegex,’/');//replace.with/
4 alert(date);//10/28/2008
第1行创建了一个变量,并且在其中存储了字符串’10.28.2008’。在一个真实的程序中,这个字符串可能是一个表单的输入。第2行创建了正则表达式:/和/分别表示正则表达式模式的开始和结束;.表示一个字面的句点;g表示一次全局替换,即句点的每次出现都会被替换。如果漏掉了g,只有第一次匹配的句点会被替换,并且,我们最终会得到’10/28.2008’。第3行执行实际的替换,将每个.更改为一个/,并且将结果存储回date变量。最终,新的格式的日期10/28/2008显示于一个警告框中。
高级用户诊断室
使用子模式替换文本
replace()方法不仅可以使用一个字符串(例如/)来替换匹配的文本(例如,10.28.2008中的.),而且,它还可以记住一个正则表达式中的子模式,并且在替换文本的时候使用这些子模式。正如14.2.4节的“注意”部分所提到的,一个子模式是正则表达式中用圆括号括起来的任何部分。例如,正则表达式/Apr(il)?\b/中的(il)就是一个子模式。
前面内容展示了用replace()方法将10.28.2008更改为10/28/2008。但是,如果我们还想要将10 28 2008或10-28-2008这样格式的日期转换为相同的10/28/2008格式,该怎么办呢?我们可以创建一个通用的模式来匹配任何这些格式,而不是编写多行JavaScript代码来替换句点、空格和连字符:
var date=’10-28-2008’;
var regex=/([01]?\d)[-\/.]([0123]?\d)
[-\/.](\d{4})/;
date=date.replace(regex,’$1/$2/$3');
这个示例使用14.2.4节介绍的正则表达式来匹配一个日期。注意圆括号中的模式组,例如([01]?\d)。每个子模式匹配日期的一部分。replace()方法记住了对这些子模式的匹配,并且可以使用它们作为替换的字符串的一部分。在这个例子中,替换字符串是’$1/$2/$3’。一个美元符号后面跟着一个数字,这个数字表示匹配的子模式之一。例如,$1匹配第一个子模式,即月份。因此,这个替换字符串可以翻译为:“将第1个子模式放在这里,后面跟着一个/,跟着第2个子模式匹配,后面跟着另一个/,然后是最后一个子模式。”