RegExp替换函数中的反向引用不起作用

Backreference in RegExp replace function not working

本文关键字:引用 不起作用 替换 函数 RegExp      更新时间:2023-09-26

下面是我的字符串替换代码:

var input = "player @renish Score";
var matches = input.replace(/@'w*/g,'$1 55');

输出为

player $1 55 Score

我想要像一样的输出

player @renish 55 Score

$1被称为反向引用,只有当存在有效的捕获组时它才会有效。

引用MDN的分组和反向参考部分,

(x)

匹配x并记住匹配。这些被称为捕获圆括号

例如,/(foo)/匹配并记住"foo bar"中的"foo"。匹配的子串可以从结果数组的元素[1], ..., [n]或从预定义的RegExp对象的属性$1, ..., $9中调用。你需要引入一个捕获组,比如这个

console.log(input.replace(/(@'w*)/g,'$1 55'));

现在,我们捕获字符串@'w*,而$1将表示捕获的字符串。


或者,根据String.prototype.replace的ECMA脚本5.1规范,可以使用$&来表示匹配的字符串。

$&

匹配的子字符串。

因此,您可以按原样使用代码,只需将替换模式更改为$&,就像这个一样

console.log(input.replace(/@'w*/g,'$& 55'));

您需要使用():指定正则表达式的哪一部分是捕获组

var input = "player @renish Score";
var matches = input.replace(/(@'w*)/g,'$1 55');
alert(matches)

否则,replace将把"$1"放到字符串中,因为您还没有指定捕获组。

您需要使用$&引用整个匹配,无需捕获组:

var input = "player @renish Score";
alert(input.replace(/@'w*/g,'$& 55'));

参见MDN参考:

$& nbsp 插入匹配的子字符串。

请注意,只有当您只需要引用某些子模式时,才应该执行添加捕获组。额外的捕获组意味着额外的开销。