奇怪的JavaScript正则表达式替换问题

Weird javascript regexp replace issue

本文关键字:替换 问题 正则表达式 JavaScript      更新时间:2023-09-26

我有以下文字

text(-) 3

我想改成:

-3

所以我写了下面的正则表达式:

'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);

演示 - 这不起作用。

但是,当我执行以下操作时

var output = 'text(-) 3'.replace(/text'(([^')]+)')/g, RegExp.$1);
output = 'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);

(所以首先我删除了?:(它可以工作

演示

因此,我一定错过了使用正则表达式对匹配进行分组(或者只是愚蠢的东西(的东西。任何帮助将不胜感激!?

代码说明

删除?:会使组捕获,这意味着它将捕获与[^')]+匹配的任何内容,并且匹配的文本可用于替换和反向引用。

var output = 'text(-) 3'.replace(/text'(([^')]+)')/g, RegExp.$1);

调用 String.replace 时,RegExp.$1尚未初始化,因此输出中的结果将" 3" 。然后执行正则表达式,捕获组捕获- text(-)并将其放置在捕获组 1 中。

已弃用的属性RegExp.$1也会使用上次执行RegExp的捕获组 1 的内容进行更新。

然后在下一行:

output = 'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);

由于RegExp.$1现在包含"-",替换给出的结果"- 3"

RegExp.$1已被弃用,因为它在所有RegExp执行和极易出错的执行之间共享。RegExp.$2 RegExp.$9的一堆其他属性也是如此,其中包含最新执行的捕获组 2 到 9 的内容。

溶液

为了您的目的,您应该这样做:

var output = 'text(-) 3'.replace(/text'(([^')]+)') */g, "$1");

不清楚)后有多少空格,所以我添加了 *。若要在替换中引用捕获组的内容,请在替换字符串中使用$1

您可能正在寻找

var output = 'text(-) 3'.replace(/text'(([^')]+)')/g, '$1');

小提琴演示

'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);问题

  • (?:[^')]+)是非捕获组,因此不会在$1中捕获值

  • RegExp.$1 包含来自上一个正则表达式匹配项的捕获组,而不是当前正则表达式匹配项

    那是

    var output = 'text(-) 3'.replace(/text'(([^')]+)')/g, RegExp.$1);
    output = 'text(-) 3'.replace(/text'((?:[^')]+)')/g, RegExp.$1);
    

    在第二条语句中,正则表达式RegExp.$1来自第一条语句,而不是来自第二条语句。因此,单独使用时,它是未设置的,不会创建预期的输出。