javascript - 正则表达式反向引用,我缺少什么?

标签 javascript regex backreference

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

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 可以直接用作字符串中的反向引用。

最佳答案

$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/

相关文章:

python : pass regex back-reference value to method

javascript - react / Hook : prevent re-rendering component with a function as prop

javascript - 使用点符号连接字符串和变量 = 错误?

javascript - 检测youtube时间,然后显示DIV?使用JavaScript

字符串的 JavaScript 正则表达式,后跟确切的字符数

regex - Mac 上的批量重命名文件正则表达式

正则表达式匹配重复字符

.htaccess - 模式中的 mod_rewrite RewriteRule 反向引用使用

javascript - 如何通过ajax调用获取返回值?

regex - 如何找到双字母并用三字母替换它们?