js強大函數(shù)replace詳解,利用其做模板方法與數(shù)據(jù)綁定

https://blog.csdn.net/s8460049/article/details/51852259

先復習一下正則表達式,正則表達式基礎知識

//星號(*) : 星號代表匹配它前面一個字符任意遍(0或任意次)     
//加號(+): 加號是一個與星號(*)類似的通配符,它也是數(shù)量詞,表示匹配前面的字符一次或多次(至少一次).    
//加號與星號的差別就在這里,星號可以匹配0次,加號則必須一次以上。   
//問號(?): 問號也是一個數(shù)量詞,它代表匹配前一個字符0或1次。     
//中括號[]: 中括號用來表示一個字符集合,    
//如果這個集合有很多元素,如26個字母,數(shù)字等,一個個地寫在中括號里,未免太麻煩太蠢笨,    
//這時可以用連字符(hyphen)來表示一個范圍,    
// 如:[a-z]表示小寫字母的集合,   
// [a-zA-Z]表示大小寫字母的集合。    
// 脫字符^ (caret).    // 這種寫法表示,匹配任何不在該集合中的字符,與上面的用法剛好相反      
//特殊字符:    //    \w -- (小寫w) 表示字母或數(shù)字,等價于 [a-zA-Z0-9]    
//    \W -- (大寫W)非字母且非數(shù)字,與\w相反 等價于 '[^A-Za-z0-9_]'    
//    \s  --  (小寫s)匹配一個空格字符,包括:空格,換行,回車,tab,等價于[ \n\r\t\f]    
//    \S --  (大寫S)匹配非空格字符,\s的相反 等價于 [^ \f\n\r\t\v]。    
//    \d -- 表示10進制數(shù)字,等價于 [0-9]    
//    \D --    匹配一個非數(shù)字字符。等價于 [^0-9]。     
//    \f    匹配一個換頁符。等價于 \x0c 和 \cL。    
//    \n    匹配一個換行符。等價于 \x0a 和 \cJ。    
//    \r    匹配一個回車符。等價于 \x0d 和 \cM。    
//    \t    匹配一個制表符。等價于 \x09 和 \cI。    
//    \v    匹配一個垂直制表符。等價于 \x0b 和 \cK。       
//    大括號:{}    //    大括號的作用是指定重復前面一個字符多少遍:    
//    {N} 重復N遍    
//    {n,m} 重復 n~m 遍    
//    {n,}  至少重復n遍    
//    {,m} 至多重復m遍      
//定位符     ^        匹配輸入字符串的開始位置。    
//定位符    $        匹配輸入字符串的結束位置。    
//   \b     匹配一個單詞邊界,也就是指單詞和空格間的位置。
//例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。    //    \B    和\b相反,匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

這個東西,一般也背不下來,只要忘記的時候,知道怎么查就可以,有個思路

函數(shù)的用法實例

<script>      /**************************************************************
*      *      *      replace用法1 - 基礎用法     最核心的易錯點:如果要替換全部匹配項,
需要傳入一個 RegExp 對象并指定其 global 屬性。
       *******************************************************/ 
   console.log('replace基本用法')     
//基本用法:    myString = "javascript is a good script language";    
//在此我想將字母a替換成字母A    console.log("大小寫單獨替換:"+myString.replace("a","A"));   
 //    我想大家運行后可以看到結果,它只替換了找到的第一個字符,如果想替換多個字符怎么辦?   
 //    答案:結合正則表達式,這也是replace的核心用法之一!     
 //將字母a替換成字母A 錯誤的寫法  少了/g    myString = "javascript is a good script language";    
console.log("全局替換少了/g:"+myString.replace(/a/,"A"));   
//console.log(myString.replace(new RegExp('a','gm'),"A"));     //將字母a替換成字母A  正確的寫法 /g表示匹配所有    myString = "javascript is a good script language";    console.log("全局替換:"+myString.replace(/a/g,"A"));
       /******************************************************************************
     replace用法2 - 高級用法 特殊標記$     *******************************************************************************/ 

//replace高級技巧 - 特殊標記$    console.log('replace功能4 - 特殊標記$')     //    對于正則replace約定了一個特殊標記符$:   
//    1.$i (i:1-99) : 表示從左到右正則子表達式所匹配的文本。   
//    2.$&:表示與正則表達式匹配的全文本。    
//    3.$`(`:切換技能鍵):表示匹配字符串的左邊文本。    
//    4.$'(‘:單引號):表示匹配字符串的右邊文本'。   
//    5.$$:表示$轉(zhuǎn)移。      
//    $i (i:1-99) : 表示從左到右正則子表達式所匹配的文本    
//案例1- 匹配后替換    
console.log('replace功能1 - 匹配后替換')    
//在本例中,我們將把所有的花引號替換為直引號:    
myString = '"a", "b"';    
myString = myString.replace(/"([^"]*)"/g, "'$1'");
//匹配"任何非引號字符",然后替換成'任何非引號字符'里面    console.log(myString)       
//案例2- 匹配后替換    
myString= "javascript is a good script language";    
console.log("只替換匹配部分:"+myString.replace(/(javascript)\s*(is)/g,"$1 $2 fun. it $2"));
//匹配javascript 0個或者多個空格 is ,然后替換成 javascript is fun. it is,    
//注意,這里只替換掉了匹配的部分,后面a good script language不再匹配部分里       

//案例3 - 分組匹配后顛倒    console.log('replace功能2 - 顛倒')    
//在本例中,我們將把 "itcast,cn" 轉(zhuǎn)換為 "cn itcast" 的形式:    
myString = "itcast , cn";    
myString = myString.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
//這里正則匹配了itcast , cn整個串,然后根據(jù)()標記    console.log(myString)      
//案例4 - 分組匹配后顛倒    
myString = "boy & girl";    
myString.replace(/(\w+)\s*&\s*(\w+)/g,"$2 & $1") //girl & boy    console.log(myString)         
//    $&:表示與正則表達式匹配的全文本。    
myString = "boy";    
myString.replace(/\w+/g,"$&-$&") // boy-boy    
console.log(myString)     
//    $`(`:切換技能鍵):表示匹配字符串的左邊文本。    
myString = "javascript";    
myString.replace(/script/,"$& != $`") //javascript != java    console.log(myString)     
//    $'(‘:單引號):表示匹配字符串的右邊文本。    
myString = "javascript";    
myString.replace(/java/,"$$&' is ") // javascript is script    console.log(myString)         /*************************************************************
*****************     replace用法2 - 高級用法 第二個參數(shù)可以是函數(shù) - 最常用      **************************************************************************
*****/         
//無敵的函數(shù) - replace第二個參數(shù)可以傳遞函數(shù)        
//如果第二參數(shù)是一個函數(shù)的話,那么函數(shù)的參數(shù)是什么呢?并且這個函數(shù)的執(zhí)行次數(shù),與正則表達式在整個串匹配的次數(shù)相同,    

console.log('replace功能5 - 無敵的函數(shù) - replace第二個參數(shù)可以傳遞函數(shù)')    
myString = "abbabc";    
myString.replace(/(a)(b)/g, function(){ 
       console.log("sunlandong")     
   console.log(arguments) // 輸出結果["ab", "a", "b", 2, "bbabc"]    
});   
 //    參數(shù)將依次為:   
 //    1、整個正則表達式匹配的字符。 
   //    2、第一分組匹配的內(nèi)容、第二分組匹配的內(nèi)容…… 以此類推直到最后一個分組。   
 //    3、此次匹配在源自符串中的下標(位置)。  
  //    4、源自符串    //    所以例子的輸出是 ["ab", "a", "b", 2, "bbabc"]    //    
函數(shù)執(zhí)行的次數(shù),就是正則在整個字符串匹配的次數(shù)     
//用法舉例  首字母大寫 -- 一個參數(shù) 表示匹配的整個字符串    console.log('replace功能3 - 將首字符轉(zhuǎn)為大寫')     
//在本例中,我們將把字符串中所有單詞的首字母都轉(zhuǎn)換為大寫:\b匹配一個單詞邊界    
myString = 'aaa bbb ccc';   
 myString=myString.replace(/\b\w+\b/g, function(word){      
  console.log("匹配的東西"+word);               
 return word.substring(0,1).toUpperCase()+word.substring(1);
}    );    
console.log(myString)      
 //用法舉例  首字母大寫 -- 多個參數(shù) - 第一個表示匹配的整個字符串,后面的表示分組中的內(nèi)容   /* 字符^    意義:表示匹配的字符必須在最前邊。    

例如:/^A/不匹配"an A,"中的'A',但匹配"An A."中最前面的'A'。    
字符$    意義:與^類似,匹配最末的字符。    
例如:/t$/不匹配"eater"中的't',但匹配"eat"中的't'。    
\s匹配任何不可見字符,包括空格、制表符、換頁符等等。
等價于[ \f\n\r\t\v]。  
  |  表示或者運算*/   
 function capitalize(str){ 
       return str.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ 
            console.log("匹配的東西"+m);            
console.log("匹配的東西第一個"+p1);         
   console.log("匹配的東西第二個"+p2);        
    return p1+p2.toUpperCase();//匹配結果 am a boy        } );   
  };   
 myString = "i am a boy !"    
console.log(capitalize(myString)) //I Am A Boy!<script>

利用replace,使用模板方法,做數(shù)據(jù)綁定

OK,了解了上面的東西之后,
下面就來實際應用一把,只是舉例應用,
并不是要真的寫一個模板,希望大家舉一反三

//簡單的數(shù)據(jù)綁定formateString  
formateString: function(str, data) {
    return str.replace(/@\((\w+)\)/g, function(match, key){                  
                 return typeof data[key] === "undefined" ? '' : data[key]   ;
          }   
  }

先貼出方法,幾行代碼也不難,意思也很簡單,
就是匹配@(任意字符),然后將其替換為參數(shù)data中相應的數(shù)據(jù)

看一下一個完整例子額

<!DOCTYPE html><html>   
<head>      
<meta charset="UTF-8">      
<title></title> 
</head>     <body>      <div id="mydiv">            <strong> 用戶名字: </strong> @(name) <br>           <strong style = 'color:green'> 地址: </strong> @(address) <br>            <strong style = 'color:yello'> 性別: </strong> @(sex)     </div>      <script type="text/javascript" src="js/jquery-1.11.2.min.js"></script>      <script type="text/javascript" src="js/satisfy.js" ></script>       <script id="mytemplate" type="text/javascript">                 </script>       <script type="text/javascript">         var user = {                name: "sunland",                address: "北京海淀",                sex: "男"            }                                   document.getElementById("mydiv").innerHTML=formateString(document.getElementById("mydiv").innerHTML,user);                      <!--                上面就是一個完整的簡單用法,                              實際應用中的話,大部分應該都是這樣的情況,html的dom節(jié)點可能都是動態(tài)生成的,               ajax請求時候,服務器返回相應的data,我們甚至要遍歷data,然后循環(huán)多次生成多個dom節(jié)點,添加到頁面,但是差不多也是這個用法                             var data = [{                   name: "sunland",                    address: "北京海淀",                    sex: "男"                },              {                   name: "sunland",                    address: "北京海淀",                    sex: "男"                },              {                   name: "sunland",                    address: "北京海淀",                    sex: "男"                },              {                   name: "sunland",                    address: "北京海淀",                    sex: "男"                }]              data為服務器返回數(shù)據(jù)                而這個時候,頁面的dom節(jié)點,需要動態(tài)生成,準備dom的字符串,以此為模板               var str = "<strong> 用戶名字: </strong> @(name) <br> "                      += "<strong style = 'color:green'> 地址: </strong> @(address) <br>"                       += "<strong style = 'color:yello'> 性別: </strong> @(sex)"                然后我們遍歷他             for(var i=0;i<data.length;i++){                 $("#mydiv").append(formateString(str,data[i]));             }                               //簡單的數(shù)據(jù)綁定formateString                                              差不多就是這個意思,現(xiàn)在比較流行的模板框架,其核心原理也都是這個函數(shù),如果有必要的話,也可以使用這些框架,               arttemplate,阿里的kissy的數(shù)據(jù)綁定部分,angular的數(shù)據(jù)綁定,facebook的開源,vue等等                          -->         function formateString(str, data) {                 return str.replace(/@\((\w+)\)/g, function(match, key) {                        return typeof data[key] === "undefined" ? '' : data[key]                    });             }       </script>   </body> </html>
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容