1

我正在编写一个微模板脚本,其中部分字符串被替换为对象选项。这是一个简短的例子:

var person = {name:"Smith",age:43};
var string = "I am {name} and I am {age} years old";

document.write(string.replace(/{([\s\S]+?)}/g,(person['$1']||"")));
document.write("<br/>");
document.write(string.replace(/{([\s\S]+?)}/g
              , function($0,$1){return person[$1]||"";}));

同样在JS Fiddle

第二个表达式工作正常,但不是第一个。有人可以解释为什么吗?我认为$1可以直接用作字符串中的反向引用。

4

4 回答 4

1

$1, $2, ...,$&只能在它们是传递给的字符串值的一部分时使用replace

string.replace(/{([\s\S]+?)}/g, '$1(matched)');
// result: "I am name(matched) and I am age(matched) years old"

但是,第一个片段实际上是:

document.write(string.replace(/{([\s\S]+?)}/g,""));

那是因为(person['$1']||"")不是可以按原样传递的值。这是一个属性查找和逻辑或,将首先被评估,它们的结果值 - ""- 将是实际传递给replace.

为了能够在匹配评估表达式,您必须使用函数来延迟评估,就像您在第二个片段中所做的那样。

于 2012-07-02T20:25:31.583 回答
1

这对我来说很有意义,我的意思是如果你看这个:

person['$1']

您基本上是在说“给我$1里面的对象person”,在这种情况下是undefined. 我猜它试图在正则表达式捕获组之前评估对象。这就是为什么你有函数替换并且它在这种情况下有效。

于 2012-07-02T20:26:24.940 回答
1

RegExp.replace方法尝试仅在字符串中解析$n表达式(以及$&其他几个 -在此处查找完整列表)。但是类似person['$1']is not a string - 它是一个表达式,可能(或可能不)被评估为字符串。只有在此评估之后,才会解析反向引用“标记”。

我想replace在你的情况下,回调是唯一非常正常的方法。

于 2012-07-02T20:28:56.260 回答
0

第二个正则表达式中的 $1 周围没有单引号。

于 2012-07-02T20:18:29.247 回答