【小贴士】探一探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模板引擎语法,现在我们有一个模板字符串,我们要将它转换为一个函数,于是我们会这么做

 1 var template = [
 2 ‘<ul class="ul-list" style="position: absolute; width: 100%; top: 0; left: 0;">‘,
 3   ‘<%for(var i = 0, len = data.length; i < len; i++) { %>‘,
 4   ‘<li data-key="<%=data[i].id %>" data-index="<%=i%>" <%if(data[i].disabled){ %> class="disabled"‘,
 5     ‘<%} %>>‘,
 6     ‘<%=data[i].name %></li>‘,
 7   ‘<%} %>‘,
 8 ‘</ul>‘,
 9 ‘<div class="cui-mask-gray">‘,
10 ‘</div>‘,
11 ‘<div class="cui-lines">‘,
12   ‘&nbsp;</div>‘
13 ].join(‘‘);
14
15 var escapes = {
16   "‘": "‘",
17   ‘\\‘: ‘\\‘,
18   ‘\r‘: ‘r‘,
19   ‘\n‘: ‘n‘,
20   ‘\t‘: ‘t‘,
21   ‘\u2028‘: ‘u2028‘,
22   ‘\u2029‘: ‘u2029‘
23 };
24 var escaper = /\\|‘|\r|\n|\t|\u2028|\u2029/g;
25
26 var index = 0;
27 var source = "__p+=‘";
28 var matcher = /(<%-[\s\S]+?)%>|<%=([\s\S]+?)%>|<%([\s\S]+?)%>|$/g;
29
30 template.replace(matcher, function (match, escape, interpolate, evaluate, offset) {
31   source += template.slice(index, offset)
32         .replace(escaper, function (match) { return ‘\\‘ + escapes[match]; });
33
34   if (escape) {
35     source += "‘+\n((__t=(" + escape + "))==null?‘‘:_.escape(__t))+\n‘";
36   }
37   if (interpolate) {
38     source += "‘+\n((__t=(" + interpolate + "))==null?‘‘:__t)+\n‘";
39   }
40   if (evaluate) {
41     source += "‘;\n" + evaluate + "\n__p+=‘";
42   }
43   index = offset + match.length;
44   return match;
45 });
46 source += "‘;\n";
47
48 source = ‘with(obj||{}){\n‘ + source + ‘}\n‘;
49
50 source = "var __t,__p=‘‘,__j=Array.prototype.join," +
51       "print=function(){__p+=__j.call(arguments,‘‘);};\n" +
52       source + "return __p;\n";
53
54 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">&nbsp;</div>‘;
}
return __p;

代码复杂度稍有提升,但是原理与上面一样,各位自己读下吧,今天的学习到此

时间: 2024-10-27 17:41:29

【小贴士】探一探javascript中的replace的相关文章

在javascript中使用replace

javascript中使用replace功能很强大,不仅可以替换为字符串,还可以利用正则表达式,对匹配到的字符串为所欲为的进行操作,首先我们来了解一下replace的基本语法 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp/substr,replacement)  返回值 一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的

JavaScript 中的 replace 方法

定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. stringObject.replace(regexp/substr,replacement) 参数 描述 regexp/substr 必需.规定子字符串或要替换的模式的 RegExp 对象. 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象. replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数. 返回值

javascript中通过replace函数搜索和替换指定字符串

javascript中我们可以通过replace函数替换部分字符串为指定字符串,本文展示了replace的详细用法,并且通过范例演示了如何进行部分替换.完整替换和不区分大小写替换. javascript中我们可以通过replace函数替换部分字符串为指定字符串.下面是replace函数的基本语法: str_var.replace("search_string", "replace_string") 下面看一个简单的范例: <script type="

深入理解 JavaScript 中的 replace 方法(转)

replace方法是属于String对象的,可用于替换字符串. 简单介绍: StringObject.replace(searchValue,replaceValue) StringObject:字符串 searchValue:字符串或正则表达式 replaceValue:字符串或者函数 字符串替换字符串 JavaScript 1 'I am loser!'.replace('loser','hero')//I am hero! 直接使用字符串能让自己从loser变成hero,但是如果有2个lo

详解JavaScript中的replace()函数

Javascript中字符串对象有一个方法replace(),它的作用非常强大.这里把它的用法整理一下.  一.方法简介 该方法的签名是:replace([RegExp|String],[String|Function]). 该方法 返回一个新的字符串,但并不改变字符串本身. 该方法接收2个参数,第一个参数可以是字符串,也可以是一个正则表达式:第二个参数可以是一个字符串,也可以是一个函数.其中第2个参数如果是函数,那么用起来是十分强大而且灵活的,不过相对来说也比较难掌握.下面就其用法进行详细说明

JavaScript中string.replace的一个特殊用法

1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5 <title></title> 6 <script type="tex

【前端】javascript中10常用的个小技巧总结

javascript中10常用的个小技巧总结 本文转自:http://www.cnblogs.com/libin-1/p/6756393.html 1. new Set() 可能有人知道ES6中提供了新的数据结构 Set,但是能够灵活运用的人或许不多.利用Set数据结构我们能够轻松的去重一个数组,比如: let arr = [1, 2, 2, 3]; let set = new Set(arr); let newArr = Array.from(set); // Array.from方法可以将

关于javascript中RegExp的实例方法exex()和test()的小&#39;冲突&#39;

之前使用js中正则表达式的过程中,基本都是用的test方法,exec很少用,更别说test和exec混用的情况,今天碰巧遇到了这个情况,于是就发现了一个小'bug'. 比如我们要匹配全文中长度为4的单词,我们通常会这么做: var str = 'my last name is junhua' var reg = /\b\w{4}\b/gvar result, i = 1 while (i > 0) { result = reg.exec(str) if(!result) { break; } c

私人定制javascript中数组小知识点(Only For Me)

先上笑话,1.刚看到一个游泳的,想起公司组织去三亚旅游,老板跳海里,各种挣扎,捞上来老板第一句话:我记得我会游泳的啊. 2.媳妇说:老公对不起,我把你新买的自行车撞散架了! 老公:没事宝贝,你若安好,便是晴天! 媳妇说:老公你太有诗意了. 老公:滚犊子,安不好我整死你! 数组的概念 javascript数组是值得有序集合,不过它实属一个javascript对象的特殊形式,这是一个很重点的定性. 创建数组 1.var a=new Array();//等同于[] 2.var a=new Array(