我有以下文字
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);
(所以在第一次我删除了?:
)它的工作原理
因此,必须有一些我错过了将匹配与正则表达式分组(或者只是一些愚蠢的东西)。任何帮助将不胜感激!?
答案 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.$2
到RegExp.$9
,其中包含最新执行的捕获组2到9的内容。
出于您的目的,您应该这样做:
var output = 'text(-) 3'.replace(/text\(([^\)]+)\) */g, "$1");
)
之后不清楚有多少个空格,所以我添加了 *
。要在替换中引用捕获组的内容,请在替换字符串中使用$1
。
答案 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
来自第一个语句而不是第二个语句。因此,当单独使用时,它将被取消设置并且不会产生预期的输出。