strObject.replace的用法

var text = "cat, bat, sat";
result = text.replace(/(.at)/g, "word ($1)");   //"word (cat), word (bat), word (sat)"

obj = {123:"AAAA"};
'{123}'.replace(/(\d{3})/, obj['$1'] );            //"{undefined}"
'{123}'.replace(/(\d{3})/, obj[+'$1'] );            //也是"{undefined}"

上面的代码,为什么第一块的代码能替换出来,第二块的代码替换出来就是undefined呢?要实现这种功能要怎么做?之前是用了2个表达式实现的,直接用replace能实现吗?

阅读 3.8k
5 个回答

使用函数替换~~

var pp='{123}'.replace(/(\d{3})/, function(value){
    return obj[value];
});

这种情况你得传入回调:

obj = {123:"AAAA"};
var res = '{123}'.replace(/(\d{3})/, function(match) {
  return obj[match];
});
console.info(res); // "{AAAA}" 

。。。。obj["$1"] 错了,,这是一个对象属性的应用,obj没有$1, $1需要放在string里面才是你匹配的数字

clipboard.png
obj = {123:"AAAA"};
'{123}'.replace(/(\d{3})/, 'obj[$1]' ); //"{undefined}"
'{123}'.replace(/(\d{3})/, 'obj[+$1]' ); //也是"{undefined}"

第二个参数应该是一个字符串的啊。

$1$2是指的replace函数的第一个参数(正则表达式)匹配到的第1、2个分组的值,是一个占位符,是由replace函数负责解析的。类似于C语言中printf函数中的%d

它只能用在replace函数的第二个参数中,并且第二个参数必须是一个字符串字面量时才可以。

但是你把它作为一个对象的属性去取值。首先这个对象根本没有一个叫做$1的属性;其次就算它有这个属性,在获取属性结束后,$1早就不复存在了,所以怎么可能得到你期望的结果。

总结一下就是:

  • $1这种特殊字符串是由replace函数处理的

  • 注意表达式的计算顺序。先对参数中的表达式求值,然后才调用replace函数。

  • 根据上面两点得到:$1必须用在字符串字面量中,且该字符串字面量直接作为replace函数的第二个参数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题