JavaScript字符串String和Array操作的有趣方法(2)


function getBaseName(str) {
var segs = str.split('.');
if(segs.length > 1) segs.pop();
return segs.join('.');
}
function getExtension(str) {
var segs = str.split('.');
if(segs.length <= 1)return '';
return segs.pop();
}


考虑到文件名中可能包含多个“.”,所以我们还是需要用“.”把除了最后一部分外的各个部分join回来。
看到可以对字符串先split再join,就可以想到,我们可以想到对于这两个方法的参数可以传入不同的字符串,这样就起到了代替String的replace方法进行子串替换的功能了,而且还是全局替换。
比如希望把所有的下划线(_)替换成横杠(-):

复制代码 代码如下:


var str = 'hello_from_ider_to_world'.split('_').join('-');
document.write(str);
//Output:
// hello-from-ider-to-world


相对于String的replace方法,该方法的有点在于:可以实现全局替换;而若要让replace能够全局替换,则需要传入正则表达式对象(RegExp)而不能是字符串作为第一参数。

replace可接受RegExp、Function作为参数
很多人知道String的replace方法是用来替换字符串子串的,也可能知道它可以接受正则表达式作为第一参数,而且如何要替换所有出现的地方,就必须要用RegExp并包含global标记。
比如之前的替换操作,用replace就应该是:

复制代码 代码如下:


var str = 'hello_from_ider_to_world'.replace(/_/g, '-');
document.write(str);


再比如很常用的trim方法,虽然JavaScript并没有提供我们也可以自己很快的实现:

复制代码 代码如下:


String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
};


我们知道正则表达式一个很强大的功能就是向后引用(Back Reference),实际上JavaScript的replace不仅在第一个参数内做向后引用,而且在替换字符串上,也可以进行向后引用,只是很多地方可能用反斜杠(\)加数字作为标示而JavaScript则是用美刀($)加数字作为标示。

复制代码 代码如下:


var friends = 'friends of Ider, friend of Angie';
var result = friends.replace(/(friends?) of (\w+)/g, "$2's $1");
document.write(result);
//output:
//Ider's friends, Angie's friend


通过在替换字符串里面进行向后引用,我们很快就把“朋友 of 谁谁谁”变成了“谁谁谁的朋友”。如果还要更复杂点怎么办呢?没有关系,replace还能接受Function作为参数作为回调函数,其中函数的第一个参数是整个匹配中的字符串,之后每一个代表个个向后引用匹配的,函数的返回值则是作为替换的字符串。所以很多使用,函数参数都会用$0, $1, $2来表示。来看个例子:

复制代码 代码如下:


var friends ="friends of mine, friend of her and friends of his";
var result = friends.replace(/(friends?) of (\w+)/g,
function($0, $1, $2) {
if($2 == 'mine') $2 = 'my';
return $2 + ' ' + $1;
});
document.write(result);
//output:
//my friends, her friend and his friends


通过回调函数就可以实现很多很负责的字符串匹配了。至于效率,就先不考虑了。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddjjw.html