20080408 - Javascript中的字符串替换replaceG
Javascript中的字符串替换会用到其内置对象String的replace方法。
原型如下:stringObj.replace(rgExp, replaceText);
先看一个例子:考虑如下网页代码会弹出什么结果?
<script>
alert("111".replace("1", "2"));
</script>
对了,是"211",而不是"222"。
就是说,Javascript的字符串替换只处理第一次匹配,而一般,这不是预期效果。
要实现结果为"222",正确的做法是,对第一个参数传入正则表达式对象。代码如下:
<script>
alert("111".replace(/1/g, "2"));
</script>
/1/g是一个javascript语法的正则表达式,g代表打开全局替换选项。
这种正则表达式语法是预编译语法,还有另一种创建正则表达式对象的语法:
re = new RegExp("1","g"),这种一般适合表达式不确定时使用。
并且可用RegExp.compile方法编译,加快正则的处理速度。
不知道javascript的设计者为什么会设计出这种怪异的正则语法: /pattern/[flags]
例如去匹配*会需要先转义,应写成/\*/g,但这样就无法用/* */去注释此行。
又如去匹配/,仅写成/\//g显然不行,因为后续两个//为javascript的注释符,
这时,可写成/^\/$/g,^和$在正则里分别代表开始和结尾。
另外,要注意这里的g标志和递归调用replace的效果不同。看例二:
<script>
var s1 = "122212".replace("12", "1").replace("12", "1").replace("12", "1").replace("12", "1");
var s2 = "122212".replace(/12/g, "1");
alert("递归调用替换:s1 = \"" + s1 + "\"");
alert("正则g选项替换:s2 = \"" + s2 + "\"");
</script>
结果是差别很大。
实际,对于stringObj.replace(rgExp, replaceText)方法,实际上有一个“重载”。
当rgExp参数仅为字符串时,作单次替换;当rgExp为正则表达式的pattern时,才做正则替换。
为了实现带g开关的字符串替换,我们可以利用prototype给String对象加入一个replaceG方法。
<script>
String.prototype.replaceG = function(sOldValue, sNewValue){
var re = new RegExp(sOldValue, "g");
this.replace(re, sNewValue);
}
alert("111".replaceG("1", "2"));
</script>
之后,再看看结果,已经是"222"了。