【问题标题】:How to capture second to last match?如何捕获倒数第二场比赛?
【发布时间】:2020-11-11 11:06:00
【问题描述】:

我正在尝试使用 RegExpString.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

【问题讨论】:

  • 函数签名不是你想的那样。第一个参数是完整匹配,而不是第一个捕获组。见MDN
  • 另外,replace 不会只替换捕获组,而是替换完整匹配。但是,您可以只捕获另一半,然后简单地将其连接回:'john deer senior third'.replace(/(\w+)( \w+)$/, (_, a, b) => `[${a}]${b}`)。可能有更漂亮/优雅的方式来做到这一点。
  • 非常感谢,您能否复制并粘贴它以获得最佳答案?

标签: javascript regex string-matching


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。第一种方法(在箭头函数中有一个参数)是我想要实现的。
猜你喜欢
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多