关于JavaScript中string 的replace


Posted in Javascript onApril 12, 2013

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

语法:string.replace(subStr/reg,replaceStr/function)

第一个参数可以是字符串的子字符串,也可以是一个正则表达式,第二个参数可以是一个字符串或者一个处理方法,下面我们分别看看

document.write('1234'.replace(1, 'X'));我们可以得到结果:X234,很正常,但是

document.write('1214'.replace(1, 'X'));我们预想结果应该是:X2X4,但是得到的结果却是:X214,也就是说如果我们第一个参数写的是子字符串,那么replace只替换第一个匹配就停止搜索

我们换为正则的写法
document.write('1214'.replace(/1/g, 'X'));这时候我们可以得到预想结果:X2X4

我们看看function的写法
var r = 'abcd'.replace(/\w/g, function() {
            return 'X';
        });
        document.write(r);

这时我们可以看到预想结果:XXXX,所有字符被替换为X,这是我之前对replace的认识,但我在JavaScript语言精粹上看到这样一个例子,我迷惑了
var t = document.getElementById('t');
        String.prototype.deentityfy = function() {
            var entity = {
                quot: '"',
                lt: '<',
                gt: '>'
            };
            return function() {
                return this.replace(/&([^&;]+);/g, function(a, b) {
                   var r = entity[b];
                    return typeof r === 'string' ? r : a;
                }); //end of replace
            };
        } ();
        document.write('<">'.deentityfy());

这段代码是为JavaScript的String对象添加一个deentityfy 方法,用以替换字符串中得HTML字符(把"替换为”,<替换为<,>替换为>),我们先忽略作者使用的语言技巧,看看他的replace是怎么用的,第一个参数是一个正则表达式,是匹配之前提到的三个字符串,第二个参数的function竟然有了两个参数,这两个参数到底是什么?为什么方法却得到了预想结果,我们来简单分析一下。

首先entity[b]是JavaScript关联数组的用法,根据数组数据的name得到value,为了方便理解,我们不妨改造一下这个方法,让它变得简单些,让我们可以更清楚地看到function的参数到底是什么,同时为了消除浏览器转码问题,我们修改一下替换字符串

String.prototype.deentityfy = function() { 
         var entity = { 
             a: 'A', 
             b: 'B', 
             c: 'C' 
         }; 
         return function() { 
             return this.replace(/1([^12])2/g, function(a, b) { 
                 for (var i = 0; i < arguments.length; i++) { 
                     document.write(arguments[i] + '<br/>'); 
                 } 
                 document.write('===========================<br/>'); 
                 var r = entity[b]; 
                 return typeof r === 'string' ? r : a; 
             }); //end of replace 
         }; 
     } ();
     document.write('1a21b21c2'.deentityfy());

这样,我们把方法的参数都打印出来,看看结果是什么
a2 
a a21b21c2 
=========================== 
b2 
 
a21b21c2 
=========================== 
c2 
c 
a21b21c2 
=========================== 
ABC

很奇怪对不对,最后的<”>是方法的结果,很正确,得到了预期结果,让我们看看function的参数部分,

function被调用了3次,恰恰是匹配的次数,每次都置换匹配字符串。

每次调用的时候方法有四个参数

第一个参数很简单,是匹配字符串

第二个很诡异,不过每个都看一遍不难得出,第二个参数是正则表达式括号内的匹配的内容

第三个参数和容易想到,是匹配项在字符串中的index

第四个参数则是原字符串

很神奇对不对,但是不是就是这样了呢,我们再写一个试试

var r = '1a21b21c2'.replace(/1\w2/g, function() {
            for (var i = 0; i < arguments.length; i++) {
                document.write(arguments[i] + '<br/>');
            }
            document.write('===========================<br/>')
            return 'X';
        });
        document.write(r);

和前面例子很像,只是简单的把所有匹配项替换为了X,看看结果
a2
a21b21c2
===========================
b2
a21b21c2
===========================
c2
a21b21c2
===========================
XXX

出乎意料对不对,结果是预期的,但是参数少了一个,第二项参数不见了,看看究竟还有什么不同——正则表达式中看似多余的括号不见了,上一个例子中,第二项参数恰恰是括号内的匹配项,是不是第二个参数就是正则表达式中括号内的匹配项呢,我们把括号加回来验证一下
var r = '1a21b21c2'.replace(/1(\w2)/g, function() {
            for (var i = 0; i < arguments.length; i++) {
                document.write(arguments[i] + '<br/>');
            }
            document.write('===========================<br/>')
            return 'X';
        });
        document.write(r);

看看结果
a2
a2
a21b21c2
===========================
b2
b2
a21b21c2
===========================
c2
c2
a21b21c2
===========================
XXX

果不其然,这样我们就了解了function中到底有哪些参数,现在看看JavaScript语言精粹重的例子就应该明白了,当然我们需要知道关联数组,立即执行函数,闭包和arguments对象,如果让我们把一句话中所有的单词首字母大写,是不是会了呢
//方法很多,这个只是验证我们刚才的理论才故意写成这样麻烦的做法
 var sentence = 'i love you';
        var upper = sentence.replace(/(\w)\w*\b/g, function(a,b) {
            return b.toUpperCase()+a.substring(1);
        });
        document.write(upper);

//这样写其实已经可以胜任
  var sentence = 'i love you';
        var upper = sentence.replace(/\w+\b/g, function(a) {
            return a.substr(0,1).toUpperCase()+a.substring(1);
        });
        document.write(upper);
Javascript 相关文章推荐
Dom 学习总结以及实例的使用介绍
Apr 24 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
jquery操作checked属性以及disabled属性的多种方法
Jun 20 Javascript
javascript日期比较方法实例分析
Jun 17 Javascript
jquery获取链接地址和跳转详解(推荐)
Aug 15 jQuery
JavaScript去掉数组重复项的方法分析【测试可用】
Jul 19 Javascript
微信小程序实现文件、图片上传功能
Aug 18 Javascript
使用vue-router在Vue页面之间传递数据的方法
Jul 15 Javascript
浅析Vue中拆分视图层代码的5点建议
Aug 15 Javascript
浅谈JS的二进制家族
May 09 Javascript
React 高阶组件HOC用法归纳
Jun 13 Javascript
面试中canvas绘制图片模糊图片问题处理
Mar 13 Javascript
关于JavaScript与HTML的交互事件
Apr 12 #Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
Apr 12 #Javascript
js实现单一html页面两套css切换代码
Apr 11 #Javascript
获取内联和链接中的样式(js代码)
Apr 11 #Javascript
JavaScript在XHTML中的用法详解
Apr 11 #Javascript
JavaScript中的noscript元素属性位置及作用介绍
Apr 11 #Javascript
javascript标签在页面中的位置探讨
Apr 11 #Javascript
You might like
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
php生成rss类用法实例
2015/04/14 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
PHP简单遍历对象示例
2016/09/28 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
2016/10/10 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
想学画画?python满足你!
2020/12/24 Python
python 下载文件的几种方法汇总
2021/01/06 Python
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
数学高效课堂实施方案
2014/03/29 职场文书
小学校本培训方案
2014/06/06 职场文书
感恩节寄语2015
2015/03/24 职场文书
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python