美文网首页
js的字符串替换函数

js的字符串替换函数

作者: 江枫 | 来源:发表于2014-10-08 20:47 被阅读271次

    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 }

    很过瘾

    相关文章

      网友评论

          本文标题:js的字符串替换函数

          本文链接:https://www.haomeiwen.com/subject/safptttx.html