js的字串替換函式

替換文字可以替換什麼

javascript吸引我的一個地方:

總能在別人的程式碼中看到另一個javascript。

好2

這不,好戲來了,

var i=0 while(/abc/g。exec(‘abcabc’)) i++

問, i 是多少?

當你發現RegExp物件用一個lastIndex屬性記錄下次匹配的起始位置時,你會逗比的一笑,要多2才會寫出上面的程式碼!

別急,再測一下你的智商,下面的程式碼輸出又是什麼?

var exp = /abc/ while(exp。exec(‘abcabc’)){ console。log(exp。lastIndex) }

不好意思,又死迴圈了注意的地方:

不具有標誌 g 和不表示全域性模式的 RegExp 物件不能使用 lastIndex 屬性

如果在成功地匹配了某個字串之後就開始檢索另一個新的字串,需要手動地把這個屬性設定為 0

你好直觀

一直很難掌握replace中的$符,直到看了下面兄臺的程式碼,瞬間領悟了。

var str = ‘abcde’; var exp = /((b)。(d))/; str。replace(exp , “——[not-match-before-match-$ ``]-[result-match-$ &]-[group1-$1,group2-$2,group3-$3]-[not-match-end-match-$ ‘]——”)

因為markdown解析器的原因,$符後面跟著一個空格,正確的是下面的樣子“——[not-match-before-match-$`]-[result-match-$&]-[group1-$1,group2-$2,group3-$3]-[not-match-end-match-$’]——”

問既然$有特殊意義,那如何表示$, $$

replace有驚喜

被人問到一事,replace中替換函式的引數問題:

function replaceFn (){ for (i in arguments) console。log(“arguments ” + i +“ :value=” + arguments[i] ) return arguments[0] } var str=‘abcabcabc’ var exp = /(c)(a)/g str。replace(exp , replaceFn )

replaceFn‘s result

ECMA3 規定,replace方法的引數 replacement 可以是函式,這時,每個匹配都呼叫該函式,函式返回的字串將作為替換文字使用。該函式的第一個引數是匹配模式的字串。接下來的引數是與模式中的子表示式匹配的字串,可以有0個或多個這樣的引數。

接下來的引數是一個整數,聲明瞭匹配在 stringObject 中出現的位置。最後一個引數是 stringObject 本身。

jQuery

中是這麼用的:

rmsPrefix = /^-ms-/ rdashAlpha = /-([\da-z])/gi function camelCase( string ) { return string。replace( rmsPrefix, “ms-” ) 。replace( rdashAlpha, function( all, letter ) { return letter。toUpperCase(); }); }

這段程式碼可以把a-bc-def置換為aBcDef。

angular

就更加兇殘了,

var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(。))/g; var MOZ_HACK_REGEXP = /^moz([A-Z])/; function camelCase(name) { return name。 replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { return offset ? letter。toUpperCase() : letter; })。 replace(MOZ_HACK_REGEXP, ’Moz$1‘); }

angular可以把a:bc:def , a_bc_def , a-bc-def統統替換為aBcDef。

angular的開發者技高一籌的用到了替換函式的倒數第二個引數——匹配出現在原字串中的位置

seajs

中也有亮點,解析factory函式依賴時,replace函式的使用,瞬間高大上了不少。

function parseDependencies(code) { var ret = [] code。replace(SLASH_RE, “”) 。replace(REQUIRE_RE, function(m, m1, m2) { if (m2) ret。push(m2) }) return ret }

很過癮