如何捕获倒数第二场比赛?

How to capture second to last match?

我正在尝试使用 RegExpString.replace 来替换 space 分隔字符串中倒数第二个出现的单词。

我不明白为什么我的代码不起作用。我在正确的匹配项周围加上了括号,那么为什么它要替换整个 RegExp 的匹配项而不是仅替换捕获组中的内容?

const re = /(\w+) \w+$/;
const string = 'john deer senior third';
const result = string.replace(re, match => `[${match}]`);

console.log(result); // john deer [senior third]

想要的结果:

john deer [senior] third

请参阅 MDN 以了解 String.prototype.replace 中替换函数的签名。第一个参数是完全匹配,捕获组在后面。

此外,replace 将替换完整匹配项,而不仅仅是第一个捕获组(正则表达式中也可以有多个捕获组)。为了缓解这种情况,您可以使用前瞻,或将后半部分连接回:

let a = 'john deer senior third'.replace(/\w+(?= \w+$)/, m => `[${m}]`);
let b = 'john deer senior third'.replace(/(\w+)( \w+)$/, (_, a, b) => `[${a}]${b}`);

console.log(a);
console.log(b);

可能还有更优雅的方法来做到这一点。