版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/chuangxin/article/details/86367071
ES6可以用字符串模板功能直接实现字符串format功能,因此本文更多的是基于ES3、ES5,当然ES6也适用。本文讨论实际项目中经常会使用的3个字符串函数实现。
1、格式化字符串, format(str, val1, val2,…)
var format = function() {
if(arguments.length == 0) return null;
var str = arguments[0], a = arguments.length > 1 ? arguments[1] : null;
if (! a || typeof a != 'object') {
for(var i=1;i<arguments.length;i++) {
var re = new RegExp('\\{' + (i-1) + '\\}','gm');
str = str.replace(re, arguments[i]);
}
} else { //对象格式化.
var r = new RegExp('\\{([\\s\\S]+?)\\}','gm'), b = null, _str = str;
while((b = r.exec(_str)) !== null) {
str = str.replace(b[0], a[b[1]]);
}
}
return str;
}
//
console.log(format("Name: {0}, age: {1}", "老马历写记", 30));
console.log(format("Name: {name}, age: {age}", {name: "老马历写记", age:30}));
实现原理:正则替换,支持2种格式化方式:
1)数字索引:format(“Name: {0}, age: {1}”, “老马历写记”, 30)
2)对象key索引:format(“Name: {name}, age: {age}”, {name: “老马历写记”, age:30})
2、去左、右字符串,实现方式1:正则替换
var ltrim = function(str) {
var i, c = arguments.length > 1 ? arguments[1] : ' ';
str += '';
var reg=new RegExp('^('+c+')*','g');
return str.replace(reg, "");
}, rtrim = function(str) {
var i, c = arguments.length > 1 ? arguments[1] : ' ';
str += '';
var reg=new RegExp('('+c+')*$','g');
return str.replace(reg, "");
};
//
var str = "aabbbcccc#..";
console.log("ltrim: ", ltrim(str, 'aa')); \\'bbbcccc#..'
console.log("rtrim: ", rtrim(str, '..')); \\''
console.log("rtrim: ", rtrim(str, '\\.\\.')); \\'aabbbcccc#'
代码分析:
实现原理,正则替换,实现代码量较少,但是实际使用中有风险:
console.log("rtrim: ", rtrim(str, ‘…’)); \’’,特殊字符没有特殊处理,导致结果不是期望输出
3、去左、右字符串,实现方式2:循环替换
var rtrim2 = function(str, end) {
end = end || ' ';
var pos = -1;
while((pos = str.lastIndexOf(end)) > -1) {
str = str.substring(0, pos);
str = rtrim2(str, end);
}
return str;
};
console.log("rtrim2: ", rtrim2(str, '..'));
代码分析:
实现原理:lastIndexOf查找,截取,代码看上去有点low,但使用安全,不会问题。
4、总结
本文讲述了字符串2种格式化方式实现,字符串去左、去右子串的2种实现方式,当然不排除有更好的处理方式,本文仅供参考。