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能实现吗?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
使用函数替换~~
这种情况你得传入回调:
。。。。obj["$1"] 错了,,这是一个对象属性的应用,obj没有$1, $1需要放在string里面才是你匹配的数字
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函数的第二个参数。