最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

字符串的replace方法應用淺析

 更新時間:2011年12月06日 22:24:15   作者:  
按照W3C的說明,String對象的replace方法調用方式是stringObject.replace(regexp/substr,replacement)。
這兩個參數(shù)都是必須的,replace() 方法的參數(shù) replacement 可以是函數(shù)而不是字符串。在這種情況下,每個匹配都調用該函數(shù),它返回的字符串將作為替換文本使用。該函數(shù)的第一個參數(shù)是匹配模式的字符串。接下來的參數(shù)是與模式中的子表達式匹配的字符串,可以有 0 個或多個這樣的參數(shù)。接下來的參數(shù)是一個整數(shù),聲明了匹配在 stringObject 中出現(xiàn)的位置。最后一個參數(shù)是 stringObject 本身。對于replacement是函數(shù)的情況,給我們提供了很大的便利。



這有一個很簡單的交換兩個單詞順序的例子,如果不用repalce可以這么做:
復制代碼 代碼如下:

(function(){
var str = 'click dblclick';
var result = str.split(/\b/).reverse().join('')
console.log(result);
})()

這么做略顯麻煩,用replace處理則顯得清爽許多:
復制代碼 代碼如下:

(function(){
var str = 'click dblclick';
var result = str.replace(/\b(\w+)(\s+)(\w+)\b/,'$3$2$1');
console.log(result);
})();

再看另一個例子——給數(shù)字加上千分位:
復制代碼 代碼如下:

(function(){
var number = 12345678900;
var result = (''+number).replace(/(\d)(?=(\d{3})+$)/g,'$1,');
console.log(result);
})();


不過現(xiàn)在要扯的是replacement作為函數(shù)的用法,所以多此一舉的把上面的形式改成函數(shù)的形式:
復制代碼 代碼如下:

(function(){
var str = 'click dblclick';
var result = str.replace(/\b(\w+)(\s+)(\w+)\b/,function(all,$1,$2,$3){
return $3+$2+$1;
});
console.log(result);
})();

(function(){
var number = 12345678900;
var result = (''+number).replace(/(\d)(?=(\d{3})+$)/g,function(all,$1){
return $1 + ',';
});
console.log(result);
})();

所以replace無非是捕獲匹配的項然后經過處理,作為返回值進行替換,只不過是函數(shù)的比較給力。
下面看一個比較實用的例子,大多數(shù)語言都有的格式化輸出,比如C語言的printf:
復制代碼 代碼如下:

(function(){
var str = '%s may have gone, but there is a time of %s';
var result = str.replace(/(%s)/g,function(){
return 'replacement';
})
console.log(result);
})()

這里有個問題就是,%s都是一樣的,替換出來都是一樣的,而且我們只能按照順序來判斷被替換的是哪一部分,如果添加一段,那么后面所有的都得變。所以我們得傳個變量進去。
復制代碼 代碼如下:

(function(){
var array = ['Swallows','return'];
var i = 0;
var str = '%s may have gone, but there is a time of %s';
var result = str.replace(/(%s)/g,function(){
return array[i++];
})
console.log(result);
})();
(function(){
var str = '#{what} may have gone, but there is a time of #{how}';
var obj = {
what : 'Swallows',
how : 'return'
}
var result = str.replace(/(?:#{(\w+)})/g,function(all,$1){
return obj[$1];
})
console.log( result);
})();

顯然用對象的方法要靠譜一點。

同時,js并沒有那么嚴格的類型要求,所以,%s這種形式也成為了局限。直接擯棄,換成我們容易理解的形式。

偽裝成函數(shù)的樣子就是:
復制代碼 代碼如下:

(function(){
function gsub(str,replaceObj){
return str.replace(/(?:#{(\w+)})/g,function(all,$1){
return replaceObj[$1];
})
}
console.log('gsub結果:',gsub('#{what} may have gone, but there is a time of #{how}',{
what : 'Swallows',
how : 'return'
}))
})();

上面的gsub借用了Prototype中的gsub方法名字,雖然Prototype中的gsub并不是用的replace,但是形式上還是很像的。

現(xiàn)在面臨的一個問題是:

#{what}這種形式的沖突問題,有可能字符串里面剛好就有這種形式的字符串,如果不作處理,后果大家都懂的。

第一種解決辦法:正則里面有轉義字符,我們也可以有,所以我們干脆在不需要的替換的部分前面加上'\'

第二種解決辦法:讓使用者自定義一個標志來替換#{}的標志,從而避免沖突。

看第一種方法:
復制代碼 代碼如下:

(function(){
var str = '#{what} may have gone, but there is a time of #{how},\\#{reserve}';
function gsub(str,replaceObj){
return str.replace(/(^|.)(?:#{(\w+)})/g,function(all,$1,$2){
if($1 == '\\'){
return '#{' + $2 +'}';
}
return $1 + replaceObj[$2];
})
}
console.log('gsub結果:',gsub(str,{
what : 'Swallows',
how : 'return'
}))
})();

上面需要注意的就是'\'在字符串中也是轉義字符,寫的時候也需要轉義。

第二種方法:

我們把'#{what}'換成<%what%>的形式。
復制代碼 代碼如下:

(function(){
function gsub(str,replaceObj,regexp){
regexp = regexp || /(?:#{(\w+)})/g;
return str.replace(regexp,function(all,$1){
return replaceObj[$1];
})
}
var str = '<%what%> may have gone, but there is a time of <%how%>,#{reserve}';
console.log('gsub結果:',gsub(str,{
what : 'Swallows',
how : 'return'
},/(?:<%(\w+)%>)/g))
})();

現(xiàn)在把gsub掛到String的原型上面
復制代碼 代碼如下:

String.prototype.gsub = function(replaceObj,regexp){
regexp = regexp || /(^|.)(?:(#{)(\w+)(}))/g;
return this.replace(regexp,function(all,$1,$2,$3,$4){
if($1 == '\\'){
return $2+$3+$4;
}
return $1 + replaceObj[$3] ;
})
}
var str = '<%what%> may have gone, but there is a time of <%how%>,\\<%how%>,#{how}';
var obj = {
what : 'Swallows',
how : 'return'
}
console.log('測試1:',str.gsub(obj,/(^|.)(?:(<%)(\w+)(%>))/g));
//Swallows may have gone, but there is a time of return,<%how%>,#{how}
console.log('測試2:',str.gsub(obj));
//<%what%> may have gone, but there is a time of <%how%>,\<%how%>,return

嘿嘿,貌似和Prototype中的gsub很像了,不過Prototype中的gsub復雜一些,原理也不一致,熟悉一下,待會再仔細分析Prototype中的gsub方法。

相關文章

  • 微信小程序實現(xiàn)簡單計算器與秒表

    微信小程序實現(xiàn)簡單計算器與秒表

    這篇文章主要為大家詳細介紹了微信小程序實現(xiàn)簡單計算器與秒表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 原生JS實現(xiàn)簡單放大鏡效果

    原生JS實現(xiàn)簡單放大鏡效果

    這篇文章主要為大家詳細介紹了原生JS實現(xiàn)簡單放大鏡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • js判斷元素是否隱藏的方法

    js判斷元素是否隱藏的方法

    這篇文章主要介紹了js判斷元素是否隱藏的方法,需要的朋友可以參考下
    2014-06-06
  • js實現(xiàn)圖片上傳到服務器和回顯

    js實現(xiàn)圖片上傳到服務器和回顯

    這篇文章主要介紹了js實現(xiàn)圖片上傳到服務器和回顯,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • bootstrap table配置參數(shù)例子

    bootstrap table配置參數(shù)例子

    這篇文章主要為大家詳細介紹了bootstrapTable的參數(shù)設置,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Javascript動態(tài)綁定事件的簡單實現(xiàn)代碼

    Javascript動態(tài)綁定事件的簡單實現(xiàn)代碼

    Javascript事件綁定的方法很多,很靈活。不過,作為比較簡單的動態(tài)綁定,下面的代碼看似正確,但得不到預期的效果。
    2010-12-12
  • javascript generator生成器函數(shù)與asnyc/await語法糖

    javascript generator生成器函數(shù)與asnyc/await語法糖

    本文主要介紹了javascript generator生成器函數(shù)與asnyc/await語法糖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • JavaScript高級程序設計 DOM學習筆記

    JavaScript高級程序設計 DOM學習筆記

    DOM是針對XML和HTML文檔的一個API:即規(guī)定了實現(xiàn)文本節(jié)點操控的屬性、方法,具體實現(xiàn)由各自瀏覽器實現(xiàn)。
    2011-09-09
  • javascript算法學習(直接插入排序)

    javascript算法學習(直接插入排序)

    假設待排序的記錄存放在數(shù)組R[1..n]中。初始時,R[1]自成1個有序區(qū),無序區(qū)為R[2..n]。從i=2起直至i=n為止,依次將R[i]插入當前的有序區(qū)R[1..i-1]中,生成含n個記錄的有序區(qū)。
    2011-04-04
  • JS實現(xiàn)簡單加減購物車效果

    JS實現(xiàn)簡單加減購物車效果

    這篇文章主要為大家詳細介紹了JS實現(xiàn)簡單加減購物車效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

开化县| 南漳县| 会东县| 大渡口区| 阿鲁科尔沁旗| 松溪县| 库尔勒市| 沙河市| 稻城县| 洪洞县| 金川县| 抚州市| 北海市| 游戏| 彩票| 偃师市| 乌拉特中旗| 彭州市| 九龙坡区| 罗平县| 平潭县| 湖北省| 将乐县| 顺平县| 金阳县| 巴中市| 云霄县| 龙山县| 手游| 浦北县| 沁源县| 虞城县| 龙山县| 舒兰市| 湖南省| 吴桥县| 金寨县| 承德市| 泰来县| 凤冈县| 九台市|