首页 > 解决方案 > 如何捕获倒数第二场比赛?

问题描述

我正在尝试使用RegExpwithString.replace替换以空格分隔的字符串中倒数第二次出现的单词。

我不明白为什么我的代码不起作用。我在正确的匹配周围有括号,那么为什么它会替换整个匹配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

标签: javascriptregexstring-matching

解决方案


请参阅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);

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


推荐阅读