一到面試題引起的好奇:
12000000.11 如何將浮點數小數點左邊的數每三位加一個逗號,如12,000,000.11?
function commafy(num){ return num && num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function($1, $2){ return $2 + ','; }); }
關於replace方法:
注:看正則表達式的匹配模式:全局匹配(//g)和非全局匹配(只替換首個匹配的字符串)
第一種情況:第二個參數為字符串
對於正則replace約定了一個特殊標記符$
1. $i( i: 1-99 ):表示從左到右正則子表達式所匹配的文本,
e.g.1 "Baude & Lee".replace(/(\w+)\s*&\s*(\w+)/g, "$2 ^ $1"); // output: Lee ^ Baude
在"$2 ^ $1"中,使用該模式替換正則表達所匹配的全字符串。
e.g.2 "Baude & Lee test".replace(/(\w+)\s*&\s*(\w+)/g, "$2 ^ $1"); // output: Lee ^ Baude test
在上面例子e.g.2中,output輸出的結果是正則表達式所能匹配的部分被"$2 ^ $1"表達式替換成功后的字符串,再加上原字符串" test".
2. $& : 有人說“表示與正則表達式匹配的全文本”,還有其他說法,但是我自己運行代碼發現,它與stringObject是相等的
e.g.3, "Baude & Lee test".replace(/(\w+)\s*&\s*(\w+)/g, "$2 ^ $1"); // $& 輸出的是"Baude & Lee test"(具體情況如何請自行測試)
3. $` : 請自行測試,不要輕易相信他人的說法有可能,你會得出意想不到的結果
4. $' : 請自行測試,不要輕易相信他人的說法有可能,你會得出意想不到的結果
第二個參數為函數:
注:當replace方法執行的時候每次都會調用該函數,返回值作為替換的數值
1 function capitialize(str){ 2 return str.replace(/(^|\s)([a-z])/g, function($1, $2, $3){ 3 return $2+$3.toUpperCase(); 4 }); 5 } 6 console.log(capitialize("i am a boy, not a girl!"));// I Am A Boy, Not A Girl
以下對於函數參數(replace(regexp, function($1,$2,$3){}))的解釋,來自摘抄(最好自行檢測,不要輕易相信他人):
1. 第一個參數為每次匹配的全文本( $& )。(個人覺得這個說法還是比較通俗易懂,不像某些文檔,不知所雲)
2. 中間參數為子表達式匹配字符串,個數不限($i(i: 1-99))。
有些同學可能對於$1,$2,$3, ...不是很理解。我來表述一下自己的理解(注意不一定正確):在正則表達式中,比如(/(^|\s)([a-z])/g)中$2==(^|\s), $3==([a-z]),大概是這個樣子進行匹配的。
上述例子中,每成功匹配一次(比如第一次成功匹配 i,都會通過Function的return值替換掉匹配成功的字符或字符串)。
3. 倒數第二個參數表示匹配文本字符串的成功的位置的下標(可以自行打印輸出查看結果)
4. 最后一個參數表示字符串本身。
相關鏈接:
1. https://msdn.microsoft.com/zh-cn/library/9dthzd08%28v=vs.94%29.aspx?f=255&MSPPError=-2147217396
2. https://msdn.microsoft.com/zh-cn/library/t0kbytzc(v=vs.94).aspx
3. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
4. http://www.w3school.com.cn/jsref/jsref_replace.asp
5. http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
如有錯誤,歡迎指正和討論☺!