【小贴士】探一探javascript中的replace
javascript字符串与数组有很多精巧的方法,比如splice、indexOf,而replace在字符串处理中偶尔会产生让人愉悦的效果
比如underscore中的模板引擎替换部分,又如信用卡分割的应用
简单来说,replace用于将字符串中一些字符替换为另一些字符,最简单的情况如下
var num = '1234567890123456';
var numStr = '';
numStr = num.replace('1', 'a');
console.log(numStr);//a234567890123456
这个结果,事实上不太理想,因为他只替换了一个,后面的1没有理我,于是这个时候正则便出现了
var num = '1234567890123456';
var numStr = '';
numStr = num.replace(/1/g, 'a');
console.log(numStr); //a234567890a23456
一个经典例子是,javascript实现的trim方法
String.prototype.trim = function () {
return this.toString().replace(/(^\s*)|(\s*$)/g, '');
};
var str = ' sssssds ';
alert('|' + str.trim() + '|'); //|sssssds|
正则出现的时候便会有一些比较特殊的标识“$”
| 字符 | 替换文本 |
|---|---|
| $1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
| $& | 与 regexp 相匹配的子串。 |
| $` | 位于匹配子串左侧的文本。 |
| $' | 位于匹配子串右侧的文本。 |
| $$ | 直接量符号。 |
var str = ' 123 ';
console.log(str.replace(/(^\s*)|(\s*$)/g, '-$&-')); //- -123- ---
一切都很美好的时候,不满足的情况发生了,我们感觉这个结果与预期不符,具体原因我们后面再说,这里先看看函数回调情况
var str = ' 123 ';
var arr = [];
/*
参数一为匹配到的字符串
参数二为子表达式中的数据对应( $i (i:1-99)),带|号便会产生(注意这里可能产生多个参数匹配)
参数三为匹配字符串的匹配下标
最后一个参数表示字符串本身
*/
console.log(str.replace(/(^\s*)|(\s*$)/g, function (match, $1, $2, offset) {
console.log(arguments);
arr.push('-' + (match || '') + '-');
return '-' + (match || '') + '-';
}));
console.log(arr); //- -123- ---
以上其实想简单说明下函数与$的关系,导致输出的原因是因为正则没有写对:
var str = ' 123 ';
console.log(str.replace(/^(\s+)|(\s+)$/g, '-$&-'));
PS:上面那个正则还是抄的,所以以后碰到类似问题还是得自己验证才行啊
另外,我有一个信用卡账号要做格式转换:123456789012 => 1234 5678 9012
这个代码要用replace的话,不用函数便行不通的
一旦匹配成功,会替换为后面函数的的返回值,这个函数匹配成功几次便会调用几次,有些时候我们可以把它当做一个循环使用
var num = '123456789012';
var reg = /\d{4}/g;
var index = 0;
var arr = []; num.replace(reg, function (match, offset) {
arr.push(match);
});
console.log(arr.join(' ')); //1234 5678 9012
最后我们来看看我们的underscore模板引擎语法,现在我们有一个模板字符串,我们要将它转换为一个函数,于是我们会这么做
var template = [
'<ul class="ul-list" style="position: absolute; width: 100%; top: 0; left: 0;">',
'<%for(var i = 0, len = data.length; i < len; i++) { %>',
'<li data-key="<%=data[i].id %>" data-index="<%=i%>" <%if(data[i].disabled){ %> class="disabled"',
'<%} %>>',
'<%=data[i].name %></li>',
'<%} %>',
'</ul>',
'<div class="cui-mask-gray">',
'</div>',
'<div class="cui-lines">',
' </div>'
].join(''); var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; var index = 0;
var source = "__p+='";
var matcher = /(<%-[\s\S]+?)%>|<%=([\s\S]+?)%>|<%([\s\S]+?)%>|$/g; template.replace(matcher, function (match, escape, interpolate, evaluate, offset) {
source += template.slice(index, offset)
.replace(escaper, function (match) { return '\\' + escapes[match]; }); if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n"; source = 'with(obj||{}){\n' + source + '}\n'; source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n"; console.log(source);
上面的代码打印出的东西:
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
with(obj||{}){
__p+='<ul class="ul-list" style="position: absolute; width: 100%; top: 0; left: 0;">';
for(var i = 0, len = data.length; i < len; i++) {
__p+='<li data-key="'+
((__t=(data[i].id ))==null?'':__t)+
'" data-index="'+
((__t=(i))==null?'':__t)+
'" ';
if(data[i].disabled){
__p+=' class="disabled"';
}
__p+='>'+
((__t=(data[i].name ))==null?'':__t)+
'</li>';
}
__p+='</ul><div class="cui-mask-gray"></div><div class="cui-lines"> </div>';
}
return __p;
代码复杂度稍有提升,但是原理与上面一样,各位自己读下吧,今天的学习到此
【小贴士】探一探javascript中的replace的更多相关文章
- 来一轮带注释的demo,彻底搞懂javascript中的replace函数
javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ...
- 在javascript中使用replace
javascript中使用replace功能很强大,不仅可以替换为字符串,还可以利用正则表达式,对匹配到的字符串为所欲为的进行操作,首先我们来了解一下replace的基本语法 定义和用法 replac ...
- JavaScript 中的 replace 方法
定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. stringObject.replace(regexp/substr,replaceme ...
- javascript中通过replace函数搜索和替换指定字符串
javascript中我们可以通过replace函数替换部分字符串为指定字符串,本文展示了replace的详细用法,并且通过范例演示了如何进行部分替换.完整替换和不区分大小写替换. javascrip ...
- 深入理解 JavaScript 中的 replace 方法(转)
replace方法是属于String对象的,可用于替换字符串. 简单介绍: StringObject.replace(searchValue,replaceValue) StringObject:字符 ...
- Javascript中使用replace()方法+正则表达式替换掉所有字符
Js中的replace方法,只能替换掉第一次匹配到的字符, 而我们经常需要替换一个字符串中所有的匹配字符,这时候可以用正则表达式: str.replace(/a/g,"b"); ...
- javascript中的replace方法
1.replace 调用方法str.replace(regexp|substr, newSubStr|function) regexp,正则表达式 substr,需要被替换的字符串 newSubStr ...
- javascript中的replace()方法
javascript中有很多很好用的操作字符串和数组的方法,replace()就是其中一个. 看看基本用法 var str = '1234512345'; var newStr = str.repla ...
- 初识bd时的一些技能小贴士
既然小豆腐如此给力,而且充分的利用主动学习的优势,已经有了迅速脑补,压倒式的优势,不过这只是表面而已,一切才刚刚开始,究竟鹿死谁手,还有待验证. 以上可以看到,小豆腐为什么拼命的要teach我们了么, ...
随机推荐
- 《Qt Quick 4小时入门》学习笔记2
http://edu.csdn.net/course/detail/1042/14805?auto_start=1 Qt Quick 4小时入门 第五章:Qt Quick基本界面元素介绍 1. ...
- Android自用-----WindowManager$BadTokenException: Unable to add window -- token null is not for an application
转自http://www.cnblogs.com/oakpip/archive/2011/04/06/2007310.html 错误产生: private Context mcontext; @Ove ...
- 外网访问原理分析 - 每天5分钟玩转 OpenStack(105)
本节我们会将上节创建的 ext_net 连接到 router,并验证内外网的连通性. 更重要的,我们会分析隐藏在表象之下的原理. 将外网连接到 Neutron 的虚拟路由器,这样 instance 才 ...
- Web APi 2.0优点和特点?在Web APi中如何启动Session状态?
前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此 ...
- The network bridge on device VMnet0 is not running
The network bridge on device VMnet0 is not running. The virtual machine will not be able to communic ...
- 窥探Swift编程之错误处理与异常抛出
在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中 ...
- 高版本->低版本迁移,低版本客户端连接高版本数据库EXP导出报错EXP-00008,ORA-01455,EXP-00000
生产环境: 源数据库:RHEL + Oracle 11.2.0.3 目标数据库:HP-UX + Oracle 10.2.0.4 需求:迁移部分表 11.2.0.3-->10.2.0.4,若 ...
- 多个Activity相互调用和Intent
MainActivity.java和OtherActivity.java的相互调用 首先MainActivity.java是Android程序自带的,新建一个类OtherActiviy extends ...
- 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...
- Elasticsearch 全教程
Elasticsearch 权威指南 在线阅读 国外自动指向 GITBOOK 项目 | 国内用户自动指向 阿里云 GITHUB 仓库 译者前言 译者现在的工作项目中需要用到 Elasticsearch ...