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

奇怪的javascript正则表达式替换问题,javascript,regex,Javascript,Regex,我有以下文字 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); (

我有以下文字

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, '$1');

文本(-)3出现问题。替换(/text\((?:[^\)]+)\)/g,RegExp.$1)

  • (?:[^\)]+)
    是一个非捕获组,因此在
    $1

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

    就是

    var output = 'text(-) 3'.replace(/text\(([^\)]+)\)/g, RegExp.$1);
    output = 'text(-) 3'.replace(/text\((?:[^\)]+)\)/g, RegExp.$1);
    
    在第二条语句中,regex
    RegExp.$1
    来自第一条语句,而不是第二条语句。因此,单独使用时,它是未设置的,不会创建预期的输出


您可能正在寻找

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

文本(-)3出现问题。替换(/text\((?:[^\)]+)\)/g,RegExp.$1)

  • (?:[^\)]+)
    是一个非捕获组,因此在
    $1

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

    就是

    var output = 'text(-) 3'.replace(/text\(([^\)]+)\)/g, RegExp.$1);
    output = 'text(-) 3'.replace(/text\((?:[^\)]+)\)/g, RegExp.$1);
    
    在第二条语句中,regex
    RegExp.$1
    来自第一条语句,而不是第二条语句。因此,单独使用时,它是未设置的,不会创建预期的输出


您可能正在寻找

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

文本(-)3出现问题。替换(/text\((?:[^\)]+)\)/g,RegExp.$1)

  • (?:[^\)]+)
    是一个非捕获组,因此在
    $1

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

    就是

    var output = 'text(-) 3'.replace(/text\(([^\)]+)\)/g, RegExp.$1);
    output = 'text(-) 3'.replace(/text\((?:[^\)]+)\)/g, RegExp.$1);
    
    在第二条语句中,regex
    RegExp.$1
    来自第一条语句,而不是第二条语句。因此,单独使用时,它是未设置的,不会创建预期的输出


您可能正在寻找

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

文本(-)3出现问题。替换(/text\((?:[^\)]+)\)/g,RegExp.$1)

  • (?:[^\)]+)
    是一个非捕获组,因此在
    $1

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

    就是

    var output = 'text(-) 3'.replace(/text\(([^\)]+)\)/g, RegExp.$1);
    output = 'text(-) 3'.replace(/text\((?:[^\)]+)\)/g, RegExp.$1);
    
    在第二条语句中,regex
    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, 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, RegExp.$1);
调用
String.replace
时,
RegExp.$1
尚未初始化,因此输出结果将为