奇怪的javascript regexp替换问题

时间:2014-12-15 14:55:02

标签: javascript regex

我有以下文字

text(-) 3

我想改成:

-3

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

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

DEMO - 这不起作用。

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

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

(所以在第一次我删除了?:)它的工作原理

DEMO

因此,必须有一些我错过了将匹配与正则表达式分组(或者只是一些愚蠢的东西)。任何帮助将不胜感激!?

2 个答案:

答案 0 :(得分:2)

代码说明

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

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.$2RegExp.$9,其中包含最新执行的捕获组2到9的内容。

解决方案

出于您的目的,您应该这样做:

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

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

答案 1 :(得分:1)

您可能正在寻找

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

Fiddle Demo

'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来自第一个语句而不是第二个语句。因此,当单独使用时,它将被取消设置并且不会产生预期的输出。