我正在编写一个微型模板脚本,其中字符串的一部分被对象选项替换。这是一个简短的例子:
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]||"";}));
第二个表达式工作正常,但不是第一个。谁能解释为什么?我认为 $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
的内容.
为了能够在匹配后评估表达式,您必须使用一个函数来延迟评估,就像在第二个片段中所做的那样。
关于javascript - 正则表达式反向引用,我缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11300540/